JVM_类文件结构

根据 java 虚拟机的规范,class 文件采用类似 c 语言结构体的伪结构来存储数据,这种伪结构只有两种数据类型:无符号数和表。

  • 无符号数属于基本数据类型,可以用来描述数字,索引引用,数量值等
  • 表是由多个无符号数或者其他表构成的复合数据类型,用于描述有层次关系的复合结构的数据

魔数与 class 文件的版本

每个 class 文件的头 4 个字节称为魔数,它唯一的作用是确定这是否是一个被虚拟机接受的 class 文件。魔数之后的 4 个字节,存储了 class 文件的版本号,高版本的 jdk 能向下兼容以前版本,但不能运行之后的版本,即使文件内容没有丝毫改变,虚拟机也会拒绝执行。

常量池

版本号之后是常量池的入口,主要用于存放字面量符号引用,java 语言在编译时并不会有连接这一步骤,而是在运行时动态连接,因此在运行时才会将符号引用转化为真正的内存地址。在 java 虚拟机运行时,需要从常量池获取符号引用。

访问标志

常量池结束之后的两个字节是访问标志,用于识别类或者接口层次的访问信息,包括这个 class 是类还是接口。

AqwKA0.png

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

class 文件中由这三项数据确定类的继承关系。

  • 类索引用于确定这个类的全限定名
  • 父类索引用于确定这个类的父类的全限定名
  • 接口索引用于描述这个类实现了哪些接口

字段表集合

用于描述类或者接口中声明的变量。包含类级变量以及实例级变量,但不包含方法内的局部变量。

方法表集合

类比字段表集合

属性表集合

字段表,方法表都可以携带自己的属性表集合,用于描述有些场景专有的信息