Class文件是一组以8位字节为基础单位的二进制流,当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。
Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储,这种伪结构中只有两种数据类型:无符号数 和 表。
无符号数:
属于基本的数据类型,u1=1个字节的无符号数,用来描述数字、索引引用、数量值等
表:
由多个无符号数或其他表作为数据项构成的复合数据类型,所有表都习惯性地以“_info”结尾。表用于描述有层次关系的复合结构的数据,整个Class文件本质上就是一张表。
offset | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
00000000 | CA | FE | BA | SE | 00 | 00 | 00 | 32 | 00 | 16 | 07 | 00 | 02 | 01 | 00 | 1D | |
00000010 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | |
00000020 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | ... | 00 | 01 |
0-3字节:魔数,确定这个文件是否能被虚拟机接受的class文件
4-5字节:次版本
6-7字节:主版本
8-9字节:常量池,0x0016=22,代表有21项常量
每一项常量都是一个表,共有11种结构各不相同的表结构数据,表开始的第一位是一个u1类型的标志位(tag,取值为1至12,缺少标志为2的数据类型),代表当前这个常量属于哪种常量类型。
A:标志位是0x07,指向常量池的第一项常量,代表这个常量属于CONSTANT_Class_info类型
tag是标志位,
name_index是一个索引值,指向常量池中一个CONSTANT_Utf8_info类型
B-C:name_index的值为 0x0002,指向常量池的第二项常量
D:标志位是0x01,代表这个常量属于CONSTANT_Utf8_info类型
E-F:0x001D=长度29个字节,