class类文件结构

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

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

1.魔数与class文件的版本

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

5、6字节——次版本号(Minor Version)
7、8字节——主版本号(Major Version)
这里写图片描述


2.常量池

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


3.访问标志

接常量池后2个字节 —— 识别一些类或接口层次的访问信息 —— 根据public等对应值计算access-flags标志
这里写图片描述
这里写图片描述


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

接着访问标志各用2个字节显示类索引、父类索引、接口表索引集合的大小。
这里写图片描述


5.字段表集合

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

先2个字节 —— fields_count —— 再2个 —— access_flags —— 再2个 —— name_index —— 再2个 —— 字段描述符descriptor_index
这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述


6.方法表集合

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

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述


7.属性表集合

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述


8.字节码指令

这里写图片描述
这里写图片描述

  1. 加载和存储指令
    这里写图片描述
    这里写图片描述

  2. 运算指令
    这里写图片描述

  3. 类型转换指令
    这里写图片描述
    这里写图片描述

  4. 对象创建与访问指令
    这里写图片描述

  5. 操作数栈管理命令
    这里写图片描述

  6. 控制转移指令
    这里写图片描述

  7. 方法调用和返回指令
    这里写图片描述
    这里写图片描述

  8. 异常处理指令
    这里写图片描述

  9. 同步指令
    这里写图片描述
    这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值