Java 使用ClassFileTransformer.transform的字节码检测

Java 使用ClassFileTransformer.transform的字节码检测,java,instrumentation,Java,Instrumentation,我用premain方法编写了一个类,并在该方法中添加了ClassFileTransformer到Instrumentation(Instrumentation.addTransformer()) 我使用 java -javaagent:<path_to_agnet.jar> <application> java-javaagent: 但是,未调用ClassFileTransformer.transform()方法。 我观察到正在调用premain。 我还注意到,如果我

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

我使用

java -javaagent:<path_to_agnet.jar> <application>
java-javaagent:
但是,未调用
ClassFileTransformer.transform()
方法。
我观察到正在调用
premain

我还注意到,如果我调用
Instrumentation.retransformClasses()
,则调用
ClassFileTransformer.transform()

在第一个定义(
Classloader.defineClass()
)中,
transform()
方法未被调用

有什么不对劲的线索吗

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

问候,, 雷杰夫

可能原因

不正确的清单

您是否遵循了定义插装类的步骤

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

  • 必须指定一个
    Premain Class
    属性,而不是
    Main Class
    ,该属性提供在代理中实现
    Premain()
    的类的完整类名
  • 如果您的代理使用任何类库,那么您应该指定
    引导类路径
    属性,因为您的检测代理需要其库从引导类加载器可见。
    如果不这样做,您可能必须对JVM使用古怪的
    -Xbootclasspath/a:…
    参数。
    命令行参数是一种很好的方法,但您希望从长远来看使用此属性,因为命令行已经从必须指定Java instrumentation agent开始增长。还是尽量保持简单为好

  • 最后,还有
    可以重新定义类的属性。
    如果设置为true,则Java instrumentation代理能够重新定义代理本身使用的类。
    这是一个相当奇怪的情况,当然不会出现太多

静默异常

(我知道了)

我正在使用
classBeingRedefined.getName()
打印类名。
classBeingRedefined
在第一次加载时为
null

底线是变换方法中是否存在未捕获异常
它将被悄悄地吃掉

是的,我遵循上面链接中提到的所有说明。具体来说,(1)在清单中指定了Premain类(也调用了Premain方法)(2)我的代理非常小,并且与任何其他jar都没有任何依赖性(3)可以重新定义类,并且可以重新转换类。它通常归结为不正确的清单文件,但如果不是这样,则需要其他测试。你能让文章中的例子起作用吗(分析变压器)?这将表明问题是在代码中还是在JDK/JRE配置中。明白了!我正在使用classBeingRedefined.getName()打印类名。classBeingRedefined在第一次加载时为null。底线是转换方法中是否存在未捕获的异常。它将被默默地吃掉。谢谢你的帮助,谢谢你的反馈。我刚把你的分析添加到我的条目中。你可以选择它作为正式答案,或者发布你自己的条目和一些细节,然后选择它作为正式答案。
Premain-Class: my.package.MyAgentClass