class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在class文件之中,中间没有添加任何分隔符。
class类文件结构
根据java虚拟机规范的规定,class文件格式采用一种类似于C语言结构体的伪结构来存储,这种伪结构有两种数据类型。

  • 无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1、2、4、8个字节的无符号数,可用来描述数字、索引引用、数量值、或者按照UTF-8编码构成的字符串值。
  • 是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性地以“_info”结尾。用于描述有层次关系的复合结构的数据,整个class文件本质上就是一张表。
    class类文件结构

1.魔数与class文件的版本

头4个字节——魔数(Magic Number)——确定文件是否被虚拟机接受的class文件——0xCAFEBABE

5、6字节——次版本号(Minor Version)
7、8字节——主版本号(Major Version)
class类文件结构


2.常量池

9、10字节 —— 常量池容量计数值 —— 从1开始 —— 如为0x0016即十进制22 —— 代表常量池有21个常量,索引值1~21 —— 仅此项从1开始计算,其它的都是从0开始的
class类文件结构
class类文件结构
接着是1个字节判断常量类型(tag)—— 接着根据该类型特点占据相应的字节位(length)
class类文件结构
class类文件结构
class类文件结构


3.访问标志

接常量池后2个字节 —— 识别一些类或接口层次的访问信息 —— 根据public等对应值计算access-flags标志
class类文件结构
class类文件结构


4.类索引、父类索引和接口索引集合

接着访问标志各用2个字节显示类索引、父类索引、接口表索引集合的大小。
class类文件结构


5.字段表集合

字段表(field_info)用于描述接口或类中声明的变量。字段包括类级变量和实例变量,但不包括在方法内部声明的变量。

先2个字节 —— fields_count —— 再2个 —— access_flags —— 再2个 —— name_index —— 再2个 —— 字段描述符descriptor_index
class类文件结构
class类文件结构

class类文件结构
class类文件结构

class类文件结构
class类文件结构


6.方法表集合

与字段表类似顺序 —— 2字节 —— 方法个数 —— 2字节 —— access_flags —— 2字节 —— name_index —— 2字节 —— descriptor_index —— 2字节 —— attributes_count —— attribute_info

class类文件结构
class类文件结构
class类文件结构
class类文件结构


7.属性表集合

class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构
class类文件结构


8.字节码指令

class类文件结构
class类文件结构

  1. 加载和存储指令
    class类文件结构
    class类文件结构

  2. 运算指令
    class类文件结构

  3. 类型转换指令
    class类文件结构
    class类文件结构

  4. 对象创建与访问指令
    class类文件结构

  5. 操作数栈管理命令
    class类文件结构

  6. 控制转移指令
    class类文件结构

  7. 方法调用和返回指令
    class类文件结构
    class类文件结构

  8. 异常处理指令
    class类文件结构

  9. 同步指令
    class类文件结构
    class类文件结构

相关文章: