六. 类文件结构

6.1 Class类文件的结构

Class文件是一组以8位字节位基础单位的二进制流,当需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。在存储数据中只有两种结构:无符号数和表。

  • 无符号数: 基本的数据类型,以u1、u2、u4、u8来分表表示1字节、2字节、4字节、8字节,可以用来描述数字、索引引用、数量值、字符串值
  • 表: 有多个无符号数或者其他表作为数据结项构成的符合数据类型,都习惯性的以_info结尾
六. 类文件结构_第1张图片

总结: Class结构中的数据项,无论顺序还是数量等都是被阉割限定的。

6.1.1 魔数和版本号

每个Class文件的头4个字节称之为魔数,它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件,值为 0xCAFEBABE.
第56个字节是主版本号,78个字节是次版本号.

6.1.2 常量池

在版本号之后是常量池入口,常量池可以理解为Class文件之中的资源仓库,是占用Class文件空间最大的数据项目之一.

  • 常量池中的常量数量是不固定的,所以有一个u2类型的数据项代表常量池的计数值

常量池中存放两大类常量:字面量符号引用.

  • 字面量: 比较接近于java常量的概念,如字符串,申明为final的常量值,
  • 符号引用: 类和接口的全限定名 字段的名称和描述符 方法的名称和描述符
  • 常量池中的每一个常量都是一个表
六. 类文件结构_第2张图片

6.1.3 访问标志

access_flags用于识别一些类或者接口层次的访问信息:

六. 类文件结构_第3张图片

一共有16个标志位可以使用,当前只定义了8个,没有使用的要求一律为0,通过 | 的方式组合.

6.1.4 类索引,父类索引与接口索引集合

类索引(this_class)和父类索引(super_class)都是u2类型数据,接口索引(interfaces)是一组u2类型的数据集合

你可能感兴趣的:(六. 类文件结构)