类文件结构
魔数
Class文件版本
- 4字节,高版本能够兼容低版本,但是不能运行更新版本的Class文件。
常量池
- 入口有表示常量池容量计数值。
- 主要包含字面量和符号引用。
- 字面量:接近Java语言层面的常量概念,例如文本字符串,声明为final的常量值等。
- 符号引用:包括类和接口的全限定名(含包名以及类名)、字段的名称和描述符、方法的名称和描述符。
访问标志
- 用于标识该Class是类还是接口、是否为public、是否为abstract、是类的话是否为final等。
类索引、父类索引与接口索引集合
字段表集合
- 用于描述接口或者类中声明的变量,包括类级变量以及实例级变量,但是不包括方法内部声明的局部变量。
- 字段描述信息包括:字段作用域(public、private、protected)、可变性(final)、并发可见性(volatile,是否强制从主内存读写)、可否被序列化(transient)、字段数据类型(基本类型、对象、数组)。
方法表集合
- 类似字段表,同样包含类访问标志、名称索引、描述符索引、属性表集合等。
- 方法中的代码在属性表集合中。
属性表集合
Code属性
- Class文件中最重要的一个属性,主要包括方法编译后的字节码。
- 异常表也在Code属性中,表示确定的代码范围(开始行数到结束行数)如果出现了某些异常要跳转到到位置。
字节码
支持的数据类型
- byte、short、int、long、float、double、char、reference
指令类型
- 加载和存储指令:常量读进操作栈、局部变量表读进操作栈、操作栈写入局部变量表
- 运算指令:加法、减法、乘法、除法、求余、取反、位移、按位与、按位或、按位异或、自增、比较
- 类型转换指令
- 对象创建与访问指令:创建类实例、创建数组、访问类与实例、加载数组元素、写回数组元素、取数组长度
- 操作数栈管理指令:出栈、复制栈顶元素并入栈、交换栈顶两个元素
- 控制转移指令:条件分支、复合条件分支、无条件分支
- 方法调用和返回指令
- 异常处理指令
- 同步指令
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.