使用ClassFileTransformer.transform的字节码检测
我已经编写了一个带有premain
方法的类,在该方法中我已经将一个ClassFileTransformer
添加到Instrumentation
( Instrumentation.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()
来打印类名。
第一次加载时, classBeingRedefined
为null
。
底线是变换方法中是否存在未捕获的exception 。
它会被默默地吃掉 。