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.字节码指令
加载和存储指令
运算指令
类型转换指令
对象创建与访问指令
操作数栈管理命令
控制转移指令
方法调用和返回指令
异常处理指令
同步指令