我在做一些 Java 字节码修改教程时很开心。他们都说我需要设置以下 list 属性: 可以重新定义类:true 可以重新转换类:true 可以设置 native 方法前缀:true 完全没问题,但是没有一个教程解释这些属性到底做了什么。 oracle 文档非常简洁,除了 Can-Set-Native-Method-Prefix: true 我认为它也允许检测 native 方法,因为它们不能简单地更改为 Java 方法...
谁能解释一下类的重新定义和重新转换之间的区别是什么?
最佳答案
首先,这些属性对于一般的字节码操作来说不是必需的。他们在那里使用 instrumentation 请求 java 代理的特殊功能。 JVM 的特性。例如。在没有它们的情况下,通过组装字节码创建新类也是可行的。
重新定义意味着代理将在任意时间点调用 Instrumentation. redefineClasses
更改现有(和已加载)类的实际定义。代理将为新定义提供字节码。
再转换是指类文件转换的过程,通常在类加载时应用。代理商可以注册ClassFileTransformer
s在初始化类之前,它们被一个接一个地调用以将转换应用于字节码。因此,重新转换 指的是 JVM 对已加载的类重复此过程的能力。在这种情况下,代理可以调用 Instrumentation.retransformClasses
指定要重新转换的类但没有字节码。相反,JVM 将调用所有已注册的具有重新转换能力的 ClassFileTransformer
来提供实际的字节码(或链式转换器的前一个转换器的结果)。
Setting a native method prefix更特别;在检测 native 方法时它可能很有用。
所以你看,在使用字节码时,你不太可能真的需要所有这些功能。
关于java - 字节码操作 list 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20068784/