Day02

第六章 类文件结构

6.3 Class类文件的结构

🔽Class文件是一组以8位字节为基础的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件中,中间没有任何分隔符,这使得整个Class文件中储存的内容几乎都是程序运行的必要数据,没有空隙存在。当遇到需要占用8个字节以上空间的数据项时,会按照高位在前的方式分割成若干个8位字节进行存储。

根据Java虚拟机规范的规定,Class文件格式采用一种类似C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表,后面的解析都要与这两种数据类型为基础。

↘️其中:

无符号数属于基本的数据类型,以u1、u2、u4、u8来表示1个字节、2个字节、4个字节、8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8构成字符串值。

表是有多个无符号数或者其他表作为数据项构成的符合数据类型,所有表都习惯性地以“_info”结尾。表用于描述有层次关系的复合结构的数据,整个Class文件本质上就是一张表,如下图所示。

Class文件结构

6.3.1魔数与Class文件的版本

每个Class文件的头4个字节称为魔数(Magic Number),它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件。紧接着魔数的4字节存储的是Class文件的版本号,Java的版本号是从45开始的。

6.3.2常量池

⛅️紧接着主次版本号之后的是常量池入口,常量池可以理解为Class文件之中的资源仓库,它是Class文件结构与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时它还是Class文件中第一个出现的表类型数据项目。

🕶由于常量池中常量的数量不是固定的,所以在常量池入口需要放置一项u2类型的数据,代表常量池容量计数值(constant_pool_count)。与Java语言习惯不一样的是,这个容量计数器是从1而不是0开始的。常量池容量为十六进制数0x0016,即十进制的22,代表常量池中有21项常量,索引范围为1-21。Class文件结构中只有常量池的容量计数是从1开始,对于其他集合类型,包括接口索引集合、字段表集合、方法表集合等的容量计数都与一般习惯相同,从0开始。

常量池中主要存放两大类常量:字面量(Literal)和符号引用(Symbolic Reference)。字面量,如文本字符串、声明为final的常量值等。而符号引用则属于编译原理方面的概念,包括了下面三种常量:

1、类和接口的全限定名;

2、字段的名称和描述符;

3、方法的名称和描述符;



JavaVM

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!