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