定义
- Class文件是一组以8字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件之中,中间没有添加任何分隔符,使得 整个Class文件中存储的内容全都是程序运行的必要数据,没有空隙存在。当遇到占用8个字节以上空间的数据项时,则会按照高位在前一的方式分割成若干个8个字节进行存储。
- 根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表,后面的解析都要以这两种数据类型为基础。
- 无符号数属于基本的数据类型,以u1、u2、u4、u8来表示1个字节、2个字节、4个字节、8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。
- 整个Class文件本质上就是一张表:
- magic:每个Class文件的头4个字节称为魔数,它的唯一作用时确定这个文件是否为一个能被虚拟机接受的Class文件。
- minor_version 和 major _version: 次版本(第5和6个字节)和主版本(第7和8个字节),高版本的JDK可以兼容以前版本的Class文件,但不能运行以后版本的Class文件,即使文件格式并未发生任何变化,虚拟机也必须拒绝执行超过其版本号的Class文件。
-
constant_pool_count : 常量值容量计数值,容量计数从1而不是0开始,如下图十六进制数0x0016为十进制数22,那么就有21个常量
-
constant_pool:常量池主要存放两大类常量:字面量和符号引用。字面量比较接近于Java语言层面的常量概念,如文本字符串、声明为final的常量值等。而符号引用则属于编译原理方面的概念,包括了下面三类常量:1、类和接口的全限定名 2、字段的名称和描述符 3、方法的名称和描述符
- access_flag:这个标识用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final等。具体标志位以及标志的含义见下表:
- this_class 和 super_class:类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名。由于Java语言不允许多重继承,所以父类索引只有一个,除了java.lang.Object外,所有Java类的父类索引都不为0。
- interfaces_count:接口计数器,标识索引表的容量。如果该类没有实现任何接口,则该计数器值为0,后面接口的索引表不再占用任何字节。代码清单6-1中的代码的类索引、父类索引与接口表索引的内容如图所示