Do more Do better

Class类文件的结构

2017.09.27
  • Class文件是一组以8位字节为基础单位的二进制流

    各个数据项目严格按照顺序紧凑地 排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎 全部是程序运行的必要数据,没有空隙存在。当遇到需要占用8位字节以上空间的数据项 时,则会按照高位在前 的方式分割成若干个8位字节进行存储。

  • 存储结构
    • 无符号数

    属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个 字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8 编码构成字符串值。

    多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性地 以“_info”结尾。

  • img

  • 魔数:每个Class文件的头4个字节称为魔数,它的唯一作用是确定这个文件 是否为一个能被虚拟机接受的Class文件。
  • 版本号:第5和第6个字节是次版本号(Minor Version),第7和第8个字节是主版本号(Major Version)。
  • 常量池:常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项u2类型的数 据,代表常量池容量计数值(constant_pool_count)。常量池中每一项常量都是一个表

    这个容 量计数是从1而不是0开始的

    • 字面量:字面量比较接近于Java语言层面的常量概念,如文本字符串、声明为final的常量值
    • 符号引用:
    • 类和接口的全限定名
    • 字段的名称和描述符
    • 方法的名称和描述符
  • 访问标志:在常量池结束之后,紧接着的两个字节代表访问标志(access_flags)。标志用于识 别一些类或者接口层次的访问信息,

    包括:这个Class是类还是接口;是否定义为public类 型;是否定义为abstract类型;如果是类的话,是否被声明为final等。

  • 类索引、父类索引与接口索引集合:类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,而接口索引集 合(interfaces)是一组u2类型的数据的集合,Class文件中由这三项数据来确定这个类的继承 关系。
  • 字段表集合:用于描述接口或者类中声明的变量。
  • 方法表结合:访问标志(access_flags)、名称索引(name_index)、描述符索 引(descriptor_index)、属性表集合(attributes)几项,
  • 属性表结合
Comments
Write a Comment