一、描述
Class文件是一组以8位(1字节)为基础单位的二进制流。
当数据项大于8位时,按照【高位在前】分割成若干个8位进行存储。
按照Java虚拟机规范的规定,Class文件结构只有两种数据类型:无符号数和表
二、无符号数
无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1字节,2字节,4字节,8字节的无符号数。
无符号数可用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。
三、表
类型 | 名字 | 名称 | 数量 | 描述 |
u4 | magic | 魔数 | 1 | Class文件1-4字节,是否能被JVM接受;0xCAFEBABE |
u2 | minor_version | 次版本号 | 1 | Class文件5-6字节 |
u2 | major_version | 主版本号 | 1 | Class文件7-8字节 |
u2 | constant_pool_count | 常量池大小 | 1 | 从1开始,第0项常量为空:不引用任何一个常量池项目 |
cp_info | constant_pool | 常量池 | constant_pool_count - 1 | 字面量:字符串、常量值等 符号引用:类和接口的全限定名;字段名称和描述符;方法名称和描述符 |
u2 | access_flag | 1 | ||
u2 | this_class | 1 | ||
u2 | super_class | 1 | ||
u2 | interfaces_count | 1 | ||
u2 | interfaces | interfaces_count | ||
u2 | fields_count | 1 | ||
field_info | fields | fields_count | ||
u2 | methods_count | 1 | ||
method_info | methods | methods_count | ||
u2 | attributes_count | 1 | ||
attribute_info | attributes | attributes_count |
3.1 常量池项目
常量 | 项目 | 类型 | 描述 |
CONSTANT_Utf8_info | tag | u1 | 1 |
length | u2 | 字符串字节数(UTF-8编码) | |
bytes | u1 | 字符串(UTF-8编码) | |
CONSTANT_Integer_info | tag | u1 | 3 |
bytes | u4 | int(高位在前) | |
CONSTANT_Float_info | tag | u1 | 4 |
bytes | u4 | float(高位在前) | |
CONSTANT_Long_info | tag | u1 | 5 |
bytes | u8 | long(高位在前) | |
CONSTANT_Double_info | tag | u1 | 6 |
bytes | u8 | double(高位在前) | |
CONSTANT_Class_info | tag | u1 | 7 |
index | u2 | 指向全限定名常量项的索引(CONSTANT_Utf8_info) | |
CONSTANT_String_info | tag | u1 | 8 |
index | u2 | 指向字符串字面量的索引(CONSTANT_Utf8_info) | |
CONSTANT_Fieldref_info | tag | u1 | 9 |
index | u2 | 指向声明字段的类或接口描述符的索引(CONSTANT_Class_info) | |
index | u2 | 指向字段描述符的索引(CONSTATN_NameAndType_info) | |
CONSTANT_Methodref_info | tag | u1 | 10 |
index | u2 | 指向声明方法的类描述符的索引(CONSTANT_Class_info) | |
index | u2 | 指向方法的名称及类型描述符的索引(CONSTANT_NameAndType_info) | |
CONSTANT_InterfaceMethodref_info | tag | u1 | 11 |
index | u2 | 指向声明方法的接口描述符的索引(CONSTANT_Class_info) | |
index | u2 | 指向方法的名称及类型描述符的索引(CONSTANT_NameAndType_info) | |
CONSTANT_NameAndType_info | tag | u1 | 12 |
index | u2 | 指向字段或方法名称常量项的索引(CONSTANT_Utf8_info) | |
index | u2 | 指向字段或方法描述符常量项的索引(CONSTANT_Utf8_info) | |
CONTANT_MethodHandle_info | tag | u1 | 15 |
reference_kind | u1 | 1-9;决定方法句柄类型;标识方法句柄的字节码行为 | |
reference_index | u2 | 对常量池的有效索引 | |
CONSTANT_MethodType_info | tag | u1 | 16 |
descriptor_index | u2 | 对常量池的有效索引,方法的描述符(CONSTANT_Utf8_info) | |
CONSTANT_InvokeDynamic_info | tag | u1 | 18 |
bootstrap_method_attr_index | u2 | 对当前Class文件中引导方法的bootstrap_methods[]数组的索引 | |
name_and_type_index | u2 | 对当前常量池的有效索引,方法名称和方法描述符(CONSTANT_NameAndType_info) |