我写了一个类premain
方法并在该方法中我添加了一个ClassFileTransformer
to Instrumentation
(Instrumentation.addTransformer()
).
我已经使用调用了一个应用程序
java -javaagent:<path_to_agnet.jar> <application>
However ClassFileTransformer.transform()
方法未被调用。
我观察到premain
正在被调用。
我还观察到,如果我打电话Instrumentation.retransformClasses()
, then ClassFileTransformer.transform()
正在被调用。
根据第一个定义(Classloader.defineClass()
), transform()
方法未被调用。
任何线索可能出了什么问题吗?
注意:如果有任何帮助,我可以发布源代码。
问候,
雷吉夫。
可能的原因
.
清单不正确
你关注了吗所需的所有步骤 http://www.donniepinkston.net/pages/programming-notes/simple-java-profiler定义一个 Instrumentation 类?
特别是“打包”步骤,其中涉及在 JAR 清单中指定一组略有不同的属性:
- 代替
Main-Class
,您必须指定一个Premain-Class
给出实现类的完整类名的属性premain()
在你的经纪人中。
Premain-Class: my.package.MyAgentClass
如果您的代理使用任何类库,那么您应该指定Boot-Class-Path
属性,因为您的仪器代理需要其库从引导类加载器中可见。
如果你不这样做,你可能不得不使用古怪的-Xbootclasspath/a:...
JVM 的参数。
命令行参数是让事情顺利进行的一个不错的方法,但从长远来看,您希望使用此属性,因为命令行已经因必须指定 Java 检测代理而不断增长。最好保持尽可能简单。
最后,还有Can-Redefine-Classes
属性。
如果它设置为 true,则 Java 检测代理能够重新定义代理本身使用的类。
这是一个非常奇怪的情况,而且肯定不会出现太多。
.
静默异常
(雷吉夫·迪瓦卡兰 https://stackoverflow.com/users/10980/rejeev-divakaran得到了那个)。
我正在使用classBeingRedefined.getName()
打印类名。
classBeingRedefined
is null
第一次加载时.
底线是如果有转换方法中未捕获的异常.
这将是默默地吃掉.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)