在Java中手动将字节写入.class文件

问题描述 投票:0回答:1

我尝试通过将字节码写入十六进制并将其存储到字符串中,然后将它们转换为字符并使用 java 将它们写入 .class 文件,从而手动将字节写入 .class 文件。我遇到的问题是,用于打印 Hello World 的 .class 文件似乎相当于另一个可以工作的 Hello World .class 文件,但是当我尝试执行生成的类文件时,出现错误 Error: error whileReading Constant Pool for Output .class:#15 处出现意外标签:0。

有什么奇怪的,因为 Hello World 类文件中有效的每个字符都存在于我的类文件中,而我的类文件却没有。

java jvm jvm-bytecode
1个回答
0
投票
由于 Java 类文件格式的二进制结构,通过以十六进制写入原始字节然后将其转换为字符来手动编辑 Java 类文件可能是一项具有挑战性的任务。 Java 类文件是具有特定结构的二进制文件,手动编辑它需要深入了解 Java 虚拟机 (JVM) 字节码格式。

您遇到的错误“读取 Output.class 的常量池时出错:#15: 0 处出现意外标记”表明生成的类文件的常量池可能存在问题。常量池是类文件结构的重要组成部分,包含有关类、方法、字段以及类使用的其他常量的信息。

以下是一些可能导致错误的原因:

  • 不正确的常量池条目:确保您已正确生成并包含所有必需的常量池条目。每个条目都有特定的格式,格式错误可能会导致此类问题。

  • 不正确的索引或引用:常量池条目通常使用索引相互引用。如果这些索引不正确或指向不存在的条目,则可能会导致类文件解析期间出现问题。

  • 不正确的类文件结构:确保遵循正确的类文件结构,包括标头、访问标志、常量池大小和其他部分。

  • 不正确的属性格式:如果您的类包含属性(例如方法的代码属性),请确保它们的格式正确。

要排查并解决问题:

  • 使用字节码查看器或反编译器将生成的类文件与工作文件进行比较。寻找常量池、标头和其他部分的差异。

  • 使用 Java 字节码汇编器或 javap 等工具来反汇编工作和生成的类文件。比较输出以识别差异。

  • 仔细检查常量池条目的准确性,密切注意每个条目的格式。

如果您可以共享生成的类文件的部分内容(尤其是常量池部分),我也许可以提供更具体的指导。请记住,手动编辑类文件很容易出错,使用字节码操作库或 Java 汇编器将是更可靠的方法。

© www.soinside.com 2019 - 2024. All rights reserved.