使用 ClassFileTransformer.transform 进行字节码检测

2024-02-08

我写了一个类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(使用前将#替换为@)

使用 ClassFileTransformer.transform 进行字节码检测 的相关文章

随机推荐