java类文件结构

1:java文件是一组以8位字节为基础单位的二进制流,其文件格式类似于C语言的伪结构来存储数据,这种伪结构只有两种数据类型:无符号数和表

无符号数:以u1,u2,u4,u8来分别代表1个字节,2个字节,4个字节,8个字节的无符号数,其用来描述数字,索引引用,数量值或者按照utf-8编码构成的字符串值。

表:由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性的以_info结尾,整个class文件就是一张表

2:魔数与class文件的版本

java类文件结构

每个class文件的头4个字节成为魔数,起作用是确定这个文件是否为一个被虚拟机识别的class文件,一些其他文件都用到了魔数,比如jpg等等文件,class文件使用的魔数是"oxCAFEBABE(咖啡宝贝)"

紧接着魔数的4个字节是字节存储的class文件的版本号:第五个和第六个字节是次版本号,第七个和第八个是主版本号

3:常量池

 紧接着住次版本号的是常量池入口,常量池可以理解为class文件的资源仓库

它是文件结构中与其他项目关联最多的数据类型,也是占用class文件空间最多的数据项目之一,由于常量池中出现的常量是不固定的,所以在常量池的入口需要放置移向u2类型的数据,代表常量池容量计数值它是从1开始的如上图所示:常量池容量是0x2d就是45,代表常量池中有45个常量索引值范围为1~45

常量池中包括两大类常量:字面量和符号引用

字面量:文本字符串,声明为final的常量值等

符号引用:类和接口的权限定名,字段的名称和描述符,方法的名称和描述符

常量池中每一项都是一个表,有14中常量类型,

java类文件结构

第一位字节是一个u1类型的标志位,图一所示是0x0A也即是类中方法的符号引用,

java类文件结构

可以看到index为0x0008,也即是指向了常量池中的第八项常量。从图一继续查找第八项常量等等一直找下去,我是没有耐心找了java类文件结构

4:访问标志

在常量池结束之后,紧接着的两个字节代表访问标志,这个标志用于识别一些类或者接口层的访问信息,包括这个class是类还是接口;是否定义为public类型,是否定义为abstract类型,如果是类的话是否被声明为final等,具体的标志位及含义见表:

java类文件结构