第三部分虚拟机执行子系统
第 6 章 类文件结构
6.1.无关性的基石
Java虚拟机提供的语言无关性
6.2. Class类文件的结构
Class文件是以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件之中,中间没有添加任何分隔符,这使得整个class文件中存储的内容几平全部都是程序运行的必要数据,没有空隙存在。
Cl ass文件格式:无符号数和表。
无符号数属于基本的数据类型,以 u I 、 u2 、 u4、 u8 来分别代表 l 个字节、 2 个字节、4 个字节和 8 个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值,或者按照UTF-8 编码构成字符串值。
表是由多个无符号数或其他表作为数据项构成的复合数据类型,所有表都习惯性地
以“info”结尾。表用于描述有层次关系的复合结构的数据,整个 Cl ass 文件本质上就一张表。
.2.1.魔数与 Class 文件的版本
每个Cl ass文件的头4个字节称为魔数 ( Magic Number ),它的唯一作用是用于确定这个文件是否为一个能被虚拟机接受的Class文件。
很多文件存储标准中都使用魔数,来进行身份识别,譬如图片格式。使用魔数而不是扩展在来进行识别主要是基于安全考虑,因为文件扩展各可以很随意地被改动。Class文件的魔数的获得很有 " 浪漫气息",值为OxCAFEBABE。
6.2.2.常量池
常量池是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时它还是在Class文件中第一个出现的表类型数据项目。
制定Class文件格式规范时,将第0项常量空出来是有特殊考虑的,这样做是为满足后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项目 ”。
Class文件结构中只有常量池的容量计数是从1开始的,对于其他集合类型从0开始的。
常量地之中 主要存放两大量常量:
字面量 ( Litcral ) 和符号引用 ( Symbo1icReferences)。
字面量:类似Java常量概念,如文本字符串、被声明为final的常量值。
符号引用:属于编译原理方面的概念。
三类常量:
类和接口的全限定名 ( Fully Qualified Name)
字段的名称和描述符 ( Descriptor )
方法的名称和描述符
虚拟机加载Class文件的时候进行动态连接:在Class文件中不会保存各个方法和字段的最终内存布局信息,因此这些字段和方法的符号引用不经过转换的话是无法直接被虚拟机使用的。当虚拟机运行时,需要从常量池获得对应的符号引用,再在类创建时或运行时解析并翻译到具体的内存地址之中。
常量池中的每一项常量都是一个表,共有11种结构各不相同的表结构数据,有一个共同的特点:表开始的第一位是一个u1类型的标志位,缺少2的标志位。