6

我已经编写了一个带有premain方法的类,并且在该方法中我添加了一个ClassFileTransformerto Instrumentation( Instrumentation.addTransformer())。

我调用了一个应用程序

java -javaagent:<path_to_agnet.jar> <application>

但是ClassFileTransformer.transform()方法没有被调用。
我观察到premain正在调用它。
我还观察到,如果我调用Instrumentation.retransformClasses(), thenClassFileTransformer.transform()就会被调用。
在第一个定义 ( Classloader.defineClass()) 中,transform()没有调用方法。

任何线索可能是什么问题?

注意:如果有任何帮助,我可以发布源代码。

问候,雷吉夫。

4

1 回答 1

4

可能的原因

.

不正确的清单

您是否遵循了定义 Instrumentation 类所需的所有步骤?

尤其是“打包”步骤,它涉及在 JAR 清单中指定一组略有不同的属性:

  • 而不是Main-Class,您必须指定一个属性,该属性给出在您的代理Premain-Class中实现的类的完整类名。premain()
Premain-Class: my.package.MyAgentClass
  • 如果您的代理使用任何类库,那么您应该指定该Boot-Class-Path属性,因为您的检测代理将需要其库从引导类加载器中可见。
    如果您不这样做,您可能不得不对-Xbootclasspath/a:...JVM 使用古怪的参数。
    命令行参数是让事情顺利进行的一种不错的方式,但从长远来看,您希望使用此属性,因为命令行已经因必须指定 Java 检测代理而增长。还不如让它尽可能简单。

  • 最后是Can-Redefine-Classes属性。
    如果设置为 true,则 Java 检测代理能够重新定义代理本身使用的类。
    这是一个非常奇怪的情况,当然不会出现太多。

.

静默异常

Rejeev Divakaran得到了那个)。

classBeingRedefined.getName()用来打印班级名称。
classBeingRedefinednull第一次加载的时候

底线是transform 方法中是否存在未捕获的异常
它会被默默地吃掉

于 2009-04-08T10:34:53.567 回答