Class文件中只有两种数据类型:无符号数和表。
无符号数属于基本数据类型:u1,u2.u4.u8分半表示1,2,4,8个字节的无符号数。用来描述数组,索引引用,数据值或者按utf-8编码的字符串值。
表是多个无符号数和表构成,习惯以_info结尾。
整个class文件本质就是一张表。
class文件的组成是按上述表的大小和内容组成的。
1.魔数和class文件的版本
u4是固定的CAFEBABE
u2次版本号00 00
u2主版本号00 33 版本号为1.7
二、常量池
u2常量池计数值,从1开始
常量池中主要放两大类常量:字面量和符号引用(字面量比较接近于Java的常量概念。如文本字符串、声明finald的常量值等;符号艺勇则属于编译原理方面的概念:类和接口的全限定名,字段的名称和描述,字符的名称符和描述符)。
常量池中每一项常量都是一个表。
表的开始第一位都是一个u1表示为,取值如上表。
0x0000000A是0x07对照上表是CONSTANT_Class_info
其常量的结构
对照class文件图0x0002 即指向了第二个索引的常量
0x01是utf-8类型的常量,其结构表
其他的可以使用Jdk bin下面的工具javap
其他的常量结构表如下
三、访问标志
在常量池结束后紧接着两个字节代表访问标志。标识类或接口的访问信息。
包括:class是类还是接口,是否是public,是否是abstract,是类的话,是否被声明final
该类为普通类0x0021
四、类索引、父类索引与接口索引集合
紧接着访问类型之后是类索引(u2)、父类索引(u2)、与接口索引集合(u2集合)
0x0001 0x0003 0x0000 分别表示类,父类,索引集合
五、字段表集合
字段主要包括的信息:字段的作用域,是否可以实例化,可变性,并发性,类型,名称。
个数,修饰符,名称索引,描述索引,
private int age;
六、属性表集合
在class文件、字段表、方法表都可以携带自己的属性表,用于描述某些场景的特有信息。
由于涉及到的内容太多,可以直接使用javap –verbose来查看其含义。