java - 字节码操作 list 条目

标签 java instrumentation bytecode-manipulation javaagents

我在做一些 Java 字节码修改教程时很开心。他们都说我需要设置以下 list 属性: 可以重新定义类:true 可以重新转换类:true 可以设置 native 方法前缀:true 完全没问题,但是没有一个教程解释这些属性到底做了什么。 oracle 文档非常简洁,除了 Can-Set-Native-Method-Prefix: true 我认为它也允许检测 native 方法,因为它们不能简单地更改为 Java 方法...

谁能解释一下类的重新定义和重新转换之间的区别是什么?

最佳答案

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

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

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

Setting a native method prefix更特别;在检测 native 方法时它可能很有用。

所以你看,在使用字节码时,你不太可能真的需要所有这些功能。

关于java - 字节码操作 list 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20068784/

相关文章:

java - 重构java字节码

java - 为什么我不能加载附加到引导类加载器搜索的资源?

java - 艾玛是如何工作的?

java - @Cachable 在没有输入参数的方法上?

java - 地理工具阅读器

java - 添加 SSL 配置后 log4j 无法与 Jetty 一起使用

java - 使用 ClassFileTransformer.transform 的字节码检测

java - ProcessBuilder:如果没有 "redirectOutput",进程就无法完成

c - 如何告诉 gcc 通过在代码的每一行调用我自己的函数来检测代码?

java - Java中如何获取Instrumentation实例