Class 文件结构
Class 文件是一组以 8 位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件之中,中间没有添加任何分隔符,这使得整个 Class 文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用 8 位字节以上空间的数据项时,则会按照高位在前(Big-Endian)的方式分割成若干个 8 位字节进行存储。
Class 文件只有两种数据类型:无符号数(基础类型)和表(引用类型)
魔数
校验文件类型的。例如java:cafababa
版本
JDK1.8 = 52
JDK1.8 = 51
Class文件版本
常量池
Constant Type | Value |
---|---|
CONSTANT_Class |
7 |
CONSTANT_Fieldref |
9 |
CONSTANT_Methodref |
10 |
CONSTANT_InterfaceMethodref |
11 |
CONSTANT_String |
8 |
CONSTANT_Integer |
3 |
CONSTANT_Float |
4 |
CONSTANT_Long |
5 |
CONSTANT_Double |
6 |
CONSTANT_NameAndType |
12 |
CONSTANT_Utf8 |
1 |
CONSTANT_MethodHandle |
15 |
CONSTANT_MethodType |
16 |
CONSTANT_InvokeDynamic |
18 |
访问标志
类索引,父类索引,接口索引集合
字段表集合
方法表集合
属性表集合
Class 文件格式
u 代表基本信息, info代表复合信息
cp_info格式:
cp_info { u1 tag; u1 info[]; }
ClassFile { u4 magic; // 魔法数字,表明当前文件是.class文件,固定0xCAFEBABE u2 minor_version; // 分别为Class文件的副版本和主版本,最小版本 u2 major_version; //最大版本 u2 constant_pool_count; // 常量池计数 cp_info constant_pool[constant_pool_count-1]; // u2 access_flags; // 类访问标识 u2 this_class; // 当前类 u2 super_class; // 父类 u2 interfaces_count; // 实现的接口数 u2 interfaces[interfaces_count]; // 实现接口信息 u2 fields_count; // 字段数量 field_info fields[fields_count]; // 包含的字段信息 u2 methods_count; // 方法数量 method_info methods[methods_count]; // 包含的方法信息 u2 attributes_count; // 属性数量 attribute_info attributes[attributes_count]; // 各种属性 }
常量池对照表(对应cp_info的tag):
Constant Type | Value |
---|---|
CONSTANT_Class |
7 |
CONSTANT_Fieldref |
9 |
CONSTANT_Methodref |
10 |
CONSTANT_InterfaceMethodref |
11 |
CONSTANT_String |
8 |
CONSTANT_Integer |
3 |
CONSTANT_Float |
4 |
CONSTANT_Long |
5 |
CONSTANT_Double |
6 |
CONSTANT_NameAndType |
12 |
CONSTANT_Utf8 |
1 |
CONSTANT_MethodHandle |
15 |
CONSTANT_MethodType |
16 |
CONSTANT_InvokeDynamic |
18 |
参考网址:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
目标:根据代码可以手写class2进制文件