4

我在做一些 Java 字节码修改教程很开心。他们都说我需要设置以下清单属性: Can-Redefine-Classes: true Can-Retransform-Classes: true Can-Set-Native-Method-Prefix: true 完全没问题,但是没有教程解释属性到底是做什么的。oracle 文档非常简洁,除了 Can-Set-Native-Method-Prefix: true 我假设它也允许检测本地方法,因为它们不能简单地更改为 Java 方法......

谁能解释一下重新定义和重新转换类有什么区别?

4

1 回答 1

4

首先,这些属性对于一般的字节码操作来说不是必需的。他们在那里使用 JVM 的检测功能为 Java 代理请求特殊功能。例如,通过组装字节码来创建新类在没有它们的情况下也可以工作。

重新定义意味着在任意时间点,代理将调用Instrumentation. redefineClasses以更改现有(和已加载)类的实际定义。代理将为新定义提供字节码。

重新转换是指类文件转换的过程,通常在类加载时应用。代理可以注册一个接一个地调用ClassFileTransformer的 s,以便在类初始化之前对字节码进行转换。因此,重新转换是指 JVM 对已加载的类重复此过程的能力。在这种情况下,代理可以调用Instrumentation.retransformClasses​​指定要重新转换的类但不指定字节码。相反,JVM 将调用所有已注册的重新转换功能ClassFileTransformer,以提供实际的字节码(或链式转换器的前一个转换器的结果)。

设置原生方法前缀更加特殊;在检测本机方法时它可能很有用。

所以你看,在玩字节码时你不太可能总是需要所有这些功能。

于 2013-11-19T11:26:29.073 回答