我编写了一个带有premain方法的类,并在该方法中添加了一个ClassFileTransformer to Instrumentation (Instrumentation.addTransformer())。
我使用以下命令调用了一个应用程序
java -javaagent:<path_to_agnet.jar> <application>但是,ClassFileTransformer.transform()方法并未被调用。
我观察到premain正在被调用。
我还观察到,如果我调用Instrumentation.retransformClasses(),那么就会调用ClassFileTransformer.transform()。
在第一个定义(Classloader.defineClass())时,未调用transform()方法。
有没有线索可能出了什么问题?
注意:如果有任何帮助,我可以发布源代码。
你好,Rejeev。
发布于 2009-04-08 10:34:54
可能的原因
。
清单不正确
您是否遵循all the steps required来定义工具类?
尤其是“打包”步骤,它涉及到在JAR的清单中指定一组略有不同的属性:
Main-Class,则必须指定一个Premain-Class属性,该属性提供在代理中实现premain()的类的完整类名。Premain-Class: my.package.MyAgentClassBoot-Class-Path属性,因为您的指令插入代理需要它的库在引导类加载器中可见。如果您不这样做,那么您可能不得不对JVM使用古怪的-Xbootclasspath/a:...参数。
命令行参数是一种很好的方法,但从长远来看,您需要使用这个属性,因为命令行已经因为必须指定Java工具代理而变得越来越大。在这里有Can-Redefine-Classes属性,这还不如让它像possible.
如果将其设置为true,则Java规范代理能够重新定义代理本身使用的类。
这是一种非常奇怪的情况,肯定不会出现太多情况。
。
静默异常
(Rejeev Divakaran得到了这个)。
我使用classBeingRedefined.getName()打印类名。
第一次加载时,classBeingRedefined is null 。
底线是在转换方法中是否存在未捕获的异常。
它将被默默地吞噬掉。
https://stackoverflow.com/questions/729368
复制相似问题