gpt4 book ai didi

java - 如何从类中获取字节码作为字节数组

转载 作者:行者123 更新时间:2023-11-29 09:43:21 24 4
gpt4 key购买 nike

给定一个任意的 Class 实例,包括运行时生成的实例(磁盘上没有 .class 文件),有没有办法获取类字节?

最佳答案

一般来说,这是不可能的。在加载类时,JVM 解析其字节码并将其转换为内部表示。之后 JVM 可以自由地忘记原始字节码,这就是 HotSpot JVM 真正发生的事情。

但是,通过某些 hack,可以检查内部类表示并将其转换回有效的类文件(尽管它与原始字节码不同)。这样的过程在 HotSpot JVM 中用于为 Instrumentation purposes 重构一个类文件。 .

作为概念证明,我写了 a program它使用 Unsafe 从 JVM 内存中提取已加载类的已处理字节码。这仅用于演示;永远不要在生产中尝试这个。

编辑

您还可以使用 Instrumentation API 获取类文件数据(可能由 JVM 修改) .这需要在 VM Bootstrap (使用 -javaagent VM 选项)或运行时通过 Dynamic Attach mechanism 加载 Java 代理。 .

以下是此类代理的示例:GetBytecode.java .

最后,如果您不介意使用 native 代码,还有 JVMTI 函数 GetConstantPoolGetBytecodes获取特定 Java 方法的字节码。

这是一个JVMTI example .

关于java - 如何从类中获取字节码作为字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35071016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com