u1:占一个字节,u2占两个字节,u4占4个字节,u8占8个字节
1、magic 魔数 u4;作用是这个文件是否能被虚拟机接受的class 文件;值为0xCAFEBABE(咖啡宝贝?);
2、minor_version 次版本号 u2;
3、major_version 主版本号 u2; 2和3都标示的是jdk的版本号;
4、constant_pool_count 常量池计数值 u2;
5、constant_pool 常量 总长度为constant_pool_count.lenght 个字节长度;
常量池就是按照上面的规则进行读取,先找tag,找到对应constant类型,然后对应去找长度,找值;
6、access_flags 访问标记 u2; 这个标记用于识别一些类或者接口层次的访问信息,包括这个class 是类还是接口,是否定义为public类型;是否定义为abstract 类型;
7、this_class 类索引 u2;
8、super_class 父类索引 u2;
9、interfaces_count 接口数量 u2;一个类里面可以有多个接口;
10、interfaces 接口 u2 * interfaces_count.lenght;
11、field_count字段 个数 u2;他是类变量和实例变量的总和;
12、fields 字段
access_flag:
字段的读取都是一步步的,按照规则来读取字段,结构也不难。
name_index:是对常量池的引用,代表着字段的简单名称以及字段;
descriptor_index:也是对常量池的引用,代表着方法的描述符(void inc()描述符为 --》()V:v 标识void)
13、methods_count 方法个数 u2;
14、methods 方法:文件结构和fields 相仿;
方法之间的代码被编译成字节口令之后,存放在方法属性表集合中一个名为(Code)的属性里面。