L
Lethal Possum
Hello everyone,
I am working on a little project to learn how to use the
Instrumentation framework work. I want to append the current class
name in the tooltip of every JComponent. Seems simple enough, right.
So I started by writing a basic ClassFileTransformer that prints every
class name. I also created a very simple GUI to test my transformer.
It all seems to work fine except that it never see the class
JComponent. At some point it prints "javax/swing/JComponent$1" but
never "javax/swing/JComponent". However if I debug my test code, I can
see that if I leave the mouse over the test label, I stop in my
breakpoint in JComponent.getToolTipText(). How is that possible
without loading the JComponent class? Or am I not understanding what's
going on here?
I've copied my source code below. Thanks in advance for your help.
Cheers,
Tom
=== Source code ===
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class Premain {
public static void premain(String agentArguments, Instrumentation
instrumentation) {
instrumentation.addTransformer(new ClassFileTransformer() {
public byte[] transform(ClassLoader loader,
String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] classfileBuffer)
throws IllegalClassFormatException {
System.out.println(className);
return classfileBuffer;
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel("test");
label.setToolTipText("test");
frame.getContentPane().add(label);
frame.pack();
frame.setVisible(true);
}
}
I am working on a little project to learn how to use the
Instrumentation framework work. I want to append the current class
name in the tooltip of every JComponent. Seems simple enough, right.
So I started by writing a basic ClassFileTransformer that prints every
class name. I also created a very simple GUI to test my transformer.
It all seems to work fine except that it never see the class
JComponent. At some point it prints "javax/swing/JComponent$1" but
never "javax/swing/JComponent". However if I debug my test code, I can
see that if I leave the mouse over the test label, I stop in my
breakpoint in JComponent.getToolTipText(). How is that possible
without loading the JComponent class? Or am I not understanding what's
going on here?
I've copied my source code below. Thanks in advance for your help.
Cheers,
Tom
=== Source code ===
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class Premain {
public static void premain(String agentArguments, Instrumentation
instrumentation) {
instrumentation.addTransformer(new ClassFileTransformer() {
public byte[] transform(ClassLoader loader,
String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] classfileBuffer)
throws IllegalClassFormatException {
System.out.println(className);
return classfileBuffer;
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel("test");
label.setToolTipText("test");
frame.getContentPane().add(label);
frame.pack();
frame.setVisible(true);
}
}