一、Class类文件的结构
- Class文件是一组以8位字节为基础单位的二进制流。
- Class文件格式采用C语音结构体的伪结构来存储数据,伪结构中只有两种数据类型:无符号数和表。
- 无符号数属于基本数据类型,用来描述数字、索引引用,数量值或者按UTF-8编码构成的字符串值;
- 表是由多个无符号数或其他表为数据项构成的复合数据类型;
- 整个Class文件本质就是一张表
魔数与Class文件的版本
- Class文件的头4个字节称为魔数(0xCAFEBABE),用来确定这个文件是否能被虚拟机接受为Class文件。
- 紧接着魔数的4个字节是Class文件版本号。
常量池
- 版本号后是常量池入口,可以理解为Class文件的资源仓库。
- 占用Class文件空间最大的数据项目之一。
- 常量池中存放:字面量(文本字符串、声明为final的常量)和符号引用(编译原理方面的概念)。
访问标志
- 常量池结束后紧接着2个字节代表访问标志,用于识别一些类或接口层次的访问信息(是类还是接口等)。
类索引、父类索引与接口索引集合
- Class文件由这三项数据来确定这个类的继承关系。
- 类索引确定类的全限定名,父类索引确定父类全限定名,接口索引集合描述这个类实现哪些接口。
字段表集合
- 字段表用于描述接口或类中声明的变量。
方法表集合
属性表集合
二、字节码指令简介
字节码与数据类型
加载和存储指令
- 用于将数据在栈帧的局部变量表和操作数栈直接来回传输。
运算指令
- 用于对两个操作数栈上的值进行某种特定运算,并把结果重新存入到操作栈顶。
类型转换指令
- 将两种冉的数值类型进行相互转换。
对象创建与访问指令
- Java虚拟机对类实例和数组的创建于操作采用不同的字节码指令。
操作数栈管理指令
- 如pop、pop2 将操作数栈的栈顶一个或两个元素出栈。
- swap将栈最顶端的两个数值互换。
控制转移指令
- 可让虚拟机从指定位置指令执行程序(类似goto跳转)。
方法调用和返回指令
异常处理指令
- throw抛出异常等。
同步指令