.class文件格式-java字节码资料的格式
.class文件格式--java字节码文件的格式1 . 目的Java 虚拟机识别的 class 文件格式包含 Java 虚拟机指令 (
.class文件格式--java字节码文件的格式
1 . 目的
Java 虚拟机识别的 class 文件格式包含 Java 虚拟机指令 (或者 bytecodes )和一个符号表以及其他的辅助信息。本文将使用 VC++ 语言解析 Java Class 文件符号表,逆向生成 Java 源代码结构。如图 1 :

之所以使用 VC++ 而不使用 Java 的主要是因为 VC++ 界面开发简单;运行速度快,不需要虚拟机;需要用指针建立复杂的数据结构。
2 . 实现
实现该工具的过程如下:
1. 解析 Class 文件,从 Class 文件中读取数据并保存到称为 ClassFile 结构体中;
2. 解析 ClassFile 结构体,生成源代码字符串;
3. 将字符串显示到视图中。
2.1 解析 Class 文件
为实现第 1 步,首先需要了解 Class 文件格式规范,参考《 Java 虚拟机规范》第四章 class 文件格式,总结 class 文件的数据结构如图 2 。
2.1.1 Class 文件格式
Class 文件格式 ClassFile 结构体的 C 语言描述如下:
CONSTANT_Utf8 的 info 指针指向的数据类型应为 CONSTANT_Utf8_info
magic 的后面是 Class 格式的版本号,图 3 的版本为 0x00000030=0.48 。版本后面是常数表的元素个数,图 3 的常数表的元素个数为 0xD2=210 个。常数表的元素个数之后如 ClassFile 结构体定义的常数表,类信息,接口信息,域信息,方法信息和附加属性等。
2.2 生成 Java 源文件
解析 Class 文件后,生产 ClassFile 结构体。遍历该结构体数据,则可根据 Java 语言规范生成 Java 源文件。例如根据 ClassFile 的 access_flags 值获得 Java 类的修饰符,其中 access 是 CArray<CString,CString&> ,保存类所有的修饰符 :
3 .总结
本文根据《 Java 虚拟机规范》开发了解析 Java Class 文件格式,并生成 Java 源代码结构的工具。其优点是:
1. 脱离 Java 虚拟机或 Java 开发环境;
2. 可查阅没有 Java 源代码的 Class 文件的内容;
3. 为一些复杂的 Java Jar 包生成相同类名的替代类,方便开发调试。例如,用返回固定字符串的 java 源文件更换需要网络链接的相同 java 类,有助于本地运行与调试。
缺点是:
1. 由于没有反编译 Bytecode ,工具生成的部分 Java 源文件需要手动添加一些 Java 属性值;
2. Java 源文件内的所需要使用的 Java 方法内容需要程序员手动实现。