1.Class类文件的结构
根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储,这种伪结构中只有两种数据类型:无符号数和表,后面的解析都要以这两种数据类型为基础。
无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值,或者按照UTF-8编码构成字符串值。
表是由多个无符号数或其他表作为数据项构成的符合数据类型,所有表都习惯性地以“_info”结尾。表用于描述有层次关系得符合结构的数据,整个Class文件本质上就是一张表。它由下表所示的数据项构成。
1.1魔术与Class文件的版本
每个Class文件的头4个字节称为魔术,它的唯一作用是用于确定这个文件是否为一个能被虚拟机接受的Class文件。紧接着魔术的4个字节存储的是Class文件的版本号:第5和第6字节是次版本号,第7和第8字节是主版本号。
1.2常量池
紧接着主次版本号之后的是常量池入口,常量池是Class文件结构中与其它项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时它还是在Class文件中第一个出现得表类型数据项目。Class文件结构中只有常量池的容量计数是从1开始的,对于其他集合类型,包括接口索引集合、字段表集合、方法表集合等的容量计数都与一般习惯相同,是从0开始的。常量池之中主要存放两大类常量:字面量和符号引用。
1.3访问标志
在常量池结束之后,紧接着的2个字节代表访问标志(access_flags),这个标志用于识别一些类或接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final,等等。
1.4类索引和父类索引
类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,而接口索引集合是一组u2类型的数据的集合;Class文件中由这三项数据来确定这个类的继承关系。类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名。类索引、父类索引和接口索引都按顺序排列在访问标志之后,类索引、父类索引用两个u2类型的索引值表示。
1.5字段表
字段表(field_info)用于描述接口或类中声明的变量。字段包含了类级变量或实例级变量,但不包括在方法内部声明的变量。
1.6方法表集合
方法表集合与字段的描述几乎采用了完全一致的方式。
1.7属性表集合
《深入理解Java虚拟机》读书笔记系列现共有7篇文章,如下。如需了解更详细内容,可购买原书。