首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ClassFileTransformer.transform的字节码插装

使用ClassFileTransformer.transform的字节码插装
EN

Stack Overflow用户
提问于 2009-04-08 10:22:04
回答 1查看 3.1K关注 0票数 6

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

我使用以下命令调用了一个应用程序

代码语言:javascript
复制
java -javaagent:<path_to_agnet.jar> <application>

但是,ClassFileTransformer.transform()方法并未被调用。

我观察到premain正在被调用。

我还观察到,如果我调用Instrumentation.retransformClasses(),那么就会调用ClassFileTransformer.transform()

在第一个定义(Classloader.defineClass())时,未调用transform()方法。

有没有线索可能出了什么问题?

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

你好,Rejeev。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-04-08 10:34:54

可能的原因

清单不正确

您是否遵循all the steps required来定义工具类?

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

  • 而不是Main-Class,则必须指定一个Premain-Class属性,该属性提供在代理中实现premain()的类的完整类名。

代码语言:javascript
复制
Premain-Class: my.package.MyAgentClass

  • 如果您的代理使用任何类库,那么您应该指定Boot-Class-Path属性,因为您的指令插入代理需要它的库在引导类加载器中可见。

如果您不这样做,那么您可能不得不对JVM使用古怪的-Xbootclasspath/a:...参数。

命令行参数是一种很好的方法,但从长远来看,您需要使用这个属性,因为命令行已经因为必须指定Java工具代理而变得越来越大。在这里有Can-Redefine-Classes属性,这还不如让它像possible.

  • Finally,一样简单。

如果将其设置为true,则Java规范代理能够重新定义代理本身使用的类。

这是一种非常奇怪的情况,肯定不会出现太多情况。

静默异常

(Rejeev Divakaran得到了这个)。

我使用classBeingRedefined.getName()打印类名。

第一次加载时,classBeingRedefined is null

底线是在转换方法中是否存在未捕获的异常。

它将被默默地吞噬掉。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/729368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档