Class文件是一组以8位字节为基础单位的二进制流。各个数据项严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分割符。
Class文件结构采用类似C语言的结构来存储数据的,主要有两类数据项,无符号数和表。
Class文件中按照严格 的顺序排列的字节流包含的数据:
ClassFile{
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[count];
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];
}
- u4 magic表示魔数,表示这个文件的类型是一个CLass文件,Class文件对应的魔数是0xCAFEBABE.
- u2 minor_version 表示Class文件的次版本号
- u2 major_version 表示文件主版本号
- u2 constant_pool_count 表示常量池的数量
- cp_info 表示常量池 存储字面量和符号引用,其中字面量主要包括字符串,final常量的值或者某个属性的初始值。而符号引用主要存储类和接口的全限定名称,字段的名称描述符,方法的名称以及描述符
限定类名,就是类名全称,带包路径的用点隔开,例如: java.lang.String。
CONSTANT_Utf8_info tag标志位为1, UTF-8编码的字符串
CONSTANT_Integer_info tag标志位为3, 整形字面量
CONSTANT_Float_info tag标志位为4, 浮点型字面量
CONSTANT_Long_info tag标志位为5, 长整形字面量
CONSTANT_Double_info tag标志位为6, 双精度字面量
CONSTANT_Class_info tag标志位为7, 类或接口的符号引用
CONSTANT_String_info tag标志位为8,字符串类型的字面量
CONSTANT_Fieldref_info tag标志位为9, 字段的符号引用
CONSTANT_Methodref_info tag标志位为10,类中方法的符号引用
CONSTANT_InterfaceMethodref_info tag标志位为11, 接口中方法的符号引用
CONSTANT_NameAndType_info tag 标志位为12,字段和方法的名称以及类型的符号引用
- u2 access_flags 表示类或者接口的访问信息
- u2 this_class 表示类的常量索引,指向常量池中CONSTRANT_Class_info的常量
- u2 super_class表示超类的索引,指向常量池中的CONSTRANT_Class_info的常量
- u2 interface_counts 表示接口的数量
- u2 interface[interface_counts]表示接口表,它里面每一项都指向CONSTRANT_Class_info常量
- u2 fields_count 表示类的实例变量和类变量的数量
- filed_info fields[fields_count]表示字段表的信息,其中字段表的结构如下
field_info{
u2 access_flags;
u2 name_index;
u2 descriptor_index;
u2 attributes_count;
attribute_info attributes[attributes_cou