使用ClassFileTransformer.transform的字节码检测

我已经编写了一个带有premain方法的类,在该方法中我已经将一个ClassFileTransformer添加到InstrumentationInstrumentation.addTransformer() )。

我已经调用了一个应用程序

 java -javaagent:  

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

有什么可能是错的线索?

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

此致,Rejeev。

可能的原因

不正确的清单

您是否遵循了定义Instrumentation类所需的所有步骤 ?

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

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

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

无声的例外

( Rejeev Divakaran得到了那个)。

我使用classBeingRedefined.getName()来打印类名。
第一次加载时, classBeingRedefinednull

底线是变换方法中是否存在未捕获的exception
它会被默默地吃掉