我用premain
方法编写了一个类,在该方法中我添加了ClassFileTransformer
到Instrumentation
(Instrumentation.addTransformer()
)。
我使用
调用了一个应用程序java -javaagent:<path_to_agnet.jar> <application>
但是没有调用ClassFileTransformer.transform()
方法
我观察到premain
正在被调用
我还观察到,如果我拨打Instrumentation.retransformClasses()
,则会调用ClassFileTransformer.transform()
在第一个定义(Classloader.defineClass()
)上,未调用transform()
方法。
有什么可能出错的线索?
注意:如果有任何帮助,我可以发布源代码。
此致 Rejeev。
答案 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()
打印班级名称
首次加载时 classBeingRedefined
为null
。
底线是变换方法中未捕获的异常 它将默默地吃掉。