总体结构
java 虚拟机规范的定义
u1 u2 u4 u8 分别表示 无符号单字节 2字节 4字节 8字节的整数
魔数(magic number)
一个4字节无符号整数 固定为 0xCAFEBABE
当虚拟机加载类的时候会首先读取并校验魔数,如果不为 0xCAFEBABE则会抛出 异常 ClassFormatError
<<自己动手写 java 虚拟机>> 的代码
版本号
紧跟在魔术后面就是 Class的小版本和大版本号
表示当前 Class 文件是由那个版本的编译器编译产生的 分别2字节标识
Class 文件版本号和平台的对应
java 虚拟机向下兼容 高版本的虚拟机可以执行由低版本编译器生成的 class 文件
除了1.1版本的虚拟机 对应的小版本号不为0 其他编译器版本的小版本号都为0
在读取并校验魔数通过之后会读取版本号并进行校验
<<自己动手写 java 虚拟机>> 的代码
常量池
跟在版本号后面的是 Class 文件的常量池信息
constant_pool_count
常量池的大小 标识该 Class 文件有多少个常量池表项 常量池0为空缺项 不存放实际内容
constant_pool
常量池表项信息 每个表项由 tag 值标识
常量池表项对应的 tag 值
格式定义
格式定义
格式定义
格式定义
格式定义
格式定义
格式定义
decriptor_index中类型的字符串标识
Class访问标识
常量池后面是访问标记 该标记使用两个字节标识,用于表明类的访问信息
class 为类可用的访问标记
当前类,父类和接口
类访问标记后面是 该类类别,父类类别以及实现的接口的数量和实现的接口的类名this_class,super_class 都是2字节的无符号整数,指向常量池中的 CONSTANT_Class
Class文件的字段
在之后是类的字段信息 首先指明字段的个数
字段的访问标记
name_index和 descriptor_index 指向常量池中 CONSTANT_Utf8 用户描述字段名及字段的类型
attributes_count 和 attributes 用于存储字段的一些属性,如初始值,注释信息等
常量属性结构
Class文件的方法基本结构
方法的执行主体 --Code 属性
记录行号和局部变量表
抛出异常 Exceptions属性
SourceFile 属性
描述当前 Class文件由哪个源文件编译得到
BootstrapMethods 属性
1.7中增加了这个属性 用于支持 invokeDynamic 指令 ,这个属性描述和保存引导方法
InnerClasses属性
描述外部类与内部类之间的关系
Deprecated 属性
表示 类方法或字段在未来版本中将被废弃











网友评论