Tag: instrumentation

在pre-main方法中使用javassist在运行时重命名字段(java instrumentation)

我想在运行时重命名java类中的字段。 此外,任何访问该字段的方法;读取或写入; 我需要将其修改为使用新名称而不是旧名称…. 所有这些都将在pre-main方法中完成…… 作为Exmaple,给出以下代码: public class Class1 { String strCompany; public String Test() { strCompany = “TestCompany”; return strCompany; } } 在上面的类中,我需要将字段“strCompany”更改为“strCompany2”,另外我需要使用方法Test来使用新名称而不是旧名称…. 可以使用ctField类中的setName方法更改字段名称,但是如何修改方法体以使用新名称。

从检测方法调用自己的类时,Java NoClassDefFoundError

我正在研究一套简单的Java代理,以帮助我(并希望其他人)对Java应用程序进行故障排除。 我想创建的一个代理工具JComponent.getToolTipText()方法通过将鼠标光标hover在其上来快速识别任何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”中的exceptionjava.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中。 所以我迷失了。 如果你们中的任何人看到我遗失的地方。 干杯, […]

使用Instrumentation记录未处理的exception

我试图使用instrumentation调试java应用程序。 当前系统的问题是 几乎没有写任何日志声明 差异处理不当 这使得很难追溯function损坏的根本原因。 为了处理这种情况,我开发了工具,java代理使用Instrumentation API,我能够注入日志语句,并解决了一半的问题。 但下一个问题是记录exception。 我想在应用程序执行期间抛出的每个exception都扩展我的工具记录。 我尝试使用javaassist API为方法注入’try-catch’块(使用addCatch , insertBefore和insertAfter ),并且它在某种程度上是有效的。 public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { if (className.startsWith(“com/alu/”)) { return insertLog(className, classBeingRedefined, classfileBuffer); } if(className.endsWith(“Exception”)){ System.out.println(“============= exception occured “+className); } 这里inserLog(..)方法将注入必要的日志语句并且工作正常,但是当有任何exception时它不会来到变换器。 但问题是一些方法处理exception内部(即使没有log / sysout)。 例如: try { if(search.equals(“Category”)){ //do operation } } […]

java是否有任何机制让VM自己跟踪方法调用,而不使用javaagent等?

我想动态地构建调用图,从任意方法调用开始,或者从运行的JVM本身中使用新线程开始构建调用图。 (这个软件将成为负载测试另一个消耗调用图的软件的测试工具) 我知道有一些SPI接口,但看起来你需要用它们运行-javaagent标志。 我想直接在VM本身访问它。 理想情况下,我想获得每个方法调用的入口和出口的回调,该方法调用的参数以及该方法中的时间。 显然在单个线程内。 我知道AOP可能会这样做,但我只是想知道JDK中是否有工具可以让我捕获它。