Class类文件结构

  • Class 文件是一组以 8 字节为基础单位的二进制流
  • 各个数据项目严格按照顺序紧凑排列在 class 文件中
  • 中间没有分隔符,这使得 class 文件中存储的内容几乎是全部程序运行的程序

包括两种类型:无符号数

无符号数

  • 属于基本数据类型
  • 按照 UTF-8 编码构成的字符串,大小使用 u1/u2/u4/u8 表示1字节、2字节、4字节、8字节

img

在class文件中,主要分为魔数Class文件的版本号常量池访问标志类索引(还包括父类索引和接口索引集合)、字段表集合方法表集合属性表集合

魔数

  • 每个 Class 的文件头的4个字节成为魔数 (Magic Number

  • 唯一作用是用于确定这个文件是否为一个能被虚拟机接受的 Class 文件

  • Class 文件魔数的值为 0xCAFEBABE。如果一个文件不是以 0xCAFEBABE 开头,那么他肯定就不是 Java class 文件

    Class文件的版本号

  • 次版本号(minor version):前 2 字节用于表示次版本号

  • 主版本号(major version):后 2 字节用于表示主版本号

    对应着 JDK 的版本号

常量池

常量池 简单理解为 class 文件的资源从库

  • 常量池容量计数值(constant pool count): 常量的数量
  • 数据集合 (constant_pool): 数量 = constant pool count - 1
    • 字面量:文本字符串、被声明为final的常量值
    • 符号引用
      • 类和接口的全限定名
      • 字段的名称和描述符
      • 方法的名称和描述符

访问标志

主要用于识别一些类或接口层次访问信息

  • 是否 final
  • 是否 pubIic private
  • 是否是接口
  • 是否是 abstact
  • 是否是注解
  • 是否是枚举

类索引、父类索引、接口索引集合

确定类的继承关系

  • 类索引(this_class):用于确定这个类的全限定名,占2字节

  • 父类索引(super_class):用于确定这个类父类的全限定名【不允许多重继承】

  • 接口索引计数器(interfaces_count): 如果该类没有实现接口,则该数字为 0

  • 接口索引集合 (interfaces): 实现的哪些接口

字段表集合

  • 字段表计数器(fields_count): 字段表数据个数
  • 字段表集合(fields): 描述声明的变量
    • publicprotectedprivate
    • static
    • final
    • volatile

方法表集合

  • 方法表计数器(methods_count): 方法数据个数
  • 方法表集合(methods): 表示方法的集合

属性表集合

属性表集合不要求其中包含的属性表具有严格的顺序,并且只要属性的名称不与已有的属性名称重复,任何人实现的编译器可以向属性表中写入自己定义的属性信息。