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

问题描述

通常,这是不可能的。在加载类时,JVM会解析其字节码并将其转换为内部表示形式。此后,JVM可以随意忘记原始字节码,这就是HotSpot JVM真正发生的情况。

但是,对于某些黑客,可以检查内部类表示并将其转换回有效的类文件(尽管它将与原始字节码不同)。在HotSpot JVM中,该过程用于重新构建用于Instrumentation目的的类文件

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

您还可以使用Instrumentation API获取文件数据(可能由JVM修改)。这需要Java代理在VM引导程序(使用-javaagentVM选项)或在运行时通过Dynamic Attach机制加载。

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

最后,如果您不介意使用本机代码,则可以使用JVMTI函数GetConstantPoolGetBytecodes获取特定Java方法的字节码。

这是一个JVMTI示例

解决方法

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

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”