六. 类文件结构
2017-10-10 本文已影响0人
柒黍
6.1 Class类文件的结构
Class文件是一组以8位字节位基础单位的二进制流,当需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。在存储数据中只有两种结构:无符号数和表。
- 无符号数: 基本的数据类型,以u1、u2、u4、u8来分表表示1字节、2字节、4字节、8字节,可以用来描述数字、索引引用、数量值、字符串值
- 表: 有多个无符号数或者其他表作为数据结项构成的符合数据类型,都习惯性的以_info结尾
总结: Class结构中的数据项,无论顺序还是数量等都是被阉割限定的。
6.1.1 魔数和版本号
每个Class文件的头4个字节称之为魔数,它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件,值为 0xCAFEBABE.
第56个字节是主版本号,78个字节是次版本号.
6.1.2 常量池
在版本号之后是常量池入口,常量池可以理解为Class文件之中的资源仓库,是占用Class文件空间最大的数据项目之一.
- 常量池中的常量数量是不固定的,所以有一个u2类型的数据项代表常量池的计数值
常量池中存放两大类常量:字面量 和 符号引用.
- 字面量: 比较接近于java常量的概念,如字符串,申明为final的常量值,
- 符号引用: 类和接口的全限定名 字段的名称和描述符 方法的名称和描述符
- 常量池中的每一个常量都是一个表
6.1.3 访问标志
access_flags用于识别一些类或者接口层次的访问信息:
一共有16个标志位可以使用,当前只定义了8个,没有使用的要求一律为0,通过 | 的方式组合.
6.1.4 类索引,父类索引与接口索引集合
类索引(this_class)和父类索引(super_class)都是u2类型数据,接口索引(interfaces)是一组u2类型的数据集合