当前位置: 首页 > 面试题库 >

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

严安志
2023-03-14
问题内容

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


问题答案:

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

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

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

编辑

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

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

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

这是一个JVMTI示例。



 类似资料:
  • 问题内容: 假设我在JVM中有一个已加载的类。是否有 可靠的 方法向JVM请求 字节码 .class的内容?即是这样的: (显然,会和一样好)。我知道我可以使用(和朋友们)来获取类文件,但是锤击类名称以获取要馈送给getResource的URL感觉是错误的。另外,我不确定在动态生成(例如使用)的情况下的行为。 有什么更好的主意吗? 注意:目标是能够推动 字节码 类到另一个JVM并使用自定义类加载器

  • 问题内容: UnsafeMutableRawPointer(Swift 3中的新增功能)指向的一个字节如何从内存中访问字节(或Int16,float等),然后由C API(核心音频等)传递给Swift函数。 问题答案: 从内存中读取原始字节并构造一个type值: (可选)字节偏移量: 还有,从一个转换到一个,假设被指向的存储器包含类型T的值: 对于值数组,您可以创建“缓冲区指针”: 缓冲区指针可能

  • 我有一个字符串,它包含字节数组的元素,比如“[B@42B19E58”,我必须将它转换回字节数组。 有人能给我一个这样做的方法吗? 在这里,我不必将一个字符串转换为字节数组。我已经有字节数组元素在字符串中,我只需要把它们放回数组。

  • 我从这里使用解决方案: 问题是当我这样做时: 我得到一个非常奇怪的字符串,类似于,但我想要一个可以保存在DB中的普通字符串。我错在哪里?

  • 问题内容: 我想从ByteArrayInputStream获取内部字节数组。我不想扩展该类或将其写入另一个字节数组。有实用程序类可以帮助我做到这一点吗? 谢谢, 问题答案: 扩展,则可以访问这些字段。这是这样做的方式。提供了构造函数以从参数获取字节数组。 但是,您可能会发现装饰器模式更有帮助。

  • 问题内容: 我一直在尝试找出如何从Java 6中的字节数组中获取 MIME类型 ,但是不幸的是还没有能够获取MIME类型。 有人可以帮助我摆脱困境吗? 问题答案: 您可以使用Java 6中提供的类。此类专门用于获取 MIME类型 。 使用它来获取MIME类型,如下所示: 对于从文件中获取,您可以使用以下代码: