使用ClassFileTransformer.transform的字节码检测

时间:2009-04-08 10:22:04

标签: java instrumentation

我用premain方法编写了一个类,在该方法中我添加了ClassFileTransformerInstrumentationInstrumentation.addTransformer())。

我使用

调用了一个应用程序
java -javaagent:<path_to_agnet.jar> <application>

但是没有调用ClassFileTransformer.transform()方法 我观察到premain正在被调用 我还观察到,如果我拨打Instrumentation.retransformClasses(),则会调用ClassFileTransformer.transform() 在第一个定义(Classloader.defineClass())上,未调用transform()方法。

有什么可能出错的线索?

注意:如果有任何帮助,我可以发布源代码。

此致 Rejeev。

1 个答案:

答案 0 :(得分:4)

可能的原因

不正确的清单

您是否按照all the steps required定义了Instrumentation类?

特别是“打包”步骤,其中涉及在JAR清单中指定一组略有不同的属性:

  
      
  • 您必须指定一个Main-Class属性,而不是Premain-Class,该属性提供在您的代理中实现premain()的类的完整类名。
  •   
Premain-Class: my.package.MyAgentClass
  
      
  • 如果您的代理使用任何类库,那么您应该指定Boot-Class-Path属性,因为您的检测代理需要从引导类加载器中看到它的库。
      如果不这样做,则可能必须使用JVM的古怪-Xbootclasspath/a:...参数   命令行参数是一种很好的方法,但是你想在长期使用这个属性,因为命令行已经从必须指定Java检测代理开始增长。不妨保持尽可能简单。

  •   
  • 最后,有Can-Redefine-Classes属性   如果将其设置为true,则Java检测代理程序可以重新定义代理程序自身使用的类   这是一个非常奇怪的情况,当然不会出现太多。

  •   

无声例外

Rejeev Divakaran得到了那个)。

我正在使用classBeingRedefined.getName()打印班级名称 首次加载时 classBeingRedefinednull

底线是变换方法中未捕获的异常 它将默默地吃掉