我正在研究一套简单的Java代理,以帮助我(并希望其他人)对Java应用程序进行故障排除。我想创建的一种代理工具是JComponent.getToolTipText()方法,只需将鼠标指针悬停在其上即可快速识别任何GUI类。

您可以在这里找到我的变压器和项目其余部分的代码:

http://sfn.cvs.sourceforge.net/viewvc/sfn/core/src/main/java/org/leplus/sfn/transformer/JComponentTransformer.java?view=markup

我启动带有附件的代理的测试GUI,如下所示:

$ java -javaagent:target / jars / sfn-0.1-agent.jar = JComponent -cp lib / jars / bcel-5.2.jar:target / jars / sfn-0.1-test.jar:target / jars / sfn-0.1- agent.jar org.leplus.sfn.test.Main

sfn-0.1-agent.jar包含org.leplus.sfn.transformer.JComponentTransformer类。
sfn-0.1-test.jar包含org.leplus.sfn.test.Main类。

这是我启动应用程序并将鼠标放在其上时应用程序打印的内容:

加载代理:JComponent
仪器准备就绪!
线程“AWT-EventQueue-0”中的异常java.lang.NoClassDefFoundError:org / leplus / sfn / tracer / ComponentTracer
在javax.swing.JComponent.getToolTipText(JComponent.java)
在javax.swing.ToolTipManager $ insideTimerAction.actionPerformed(ToolTipManager.java:662)
...

令我惊讶的是,如果我更改转换器以从JRE调用任何类,则它可以工作。但是,当我调用自己的类org.leplus.sfn.tracer.ComponentTracer时,它不起作用。我的第一个猜测是类路径问题,但是ComponentTracer既在类路径中,又在代理的jar中。所以我迷路了。

如果你们中有人看到我在想什么。

干杯,

汤姆

最佳答案

这是一个类加载器问题。您正在检测由引导类加载器管理的类(javax.swing.JComponent),并使其引用由系统类加载器管理的类(org.leplus.sfn.tracer.ComponentTracer)。

如果将ComponentTracer类放入引导类加载器中,该问题应会消失。

java -Xbootclasspath/p:<path/to/jar/containing/ComponentTracer> -javaagent:...

09-26 20:12