总体结构
java 虚拟机规范的定义
u1 u2 u4 u8 分别表示 无符号单字节 2字节 4字节 8字节的整数
魔数(magic number)
一个4字节无符号整数 固定为 0xCAFEBABE
当虚拟机加载类的时候会首先读取并校验魔数,如果不为 0xCAFEBABE则会抛出 异常 ClassFormatError
版本号
紧跟在魔术后面就是 Class的小版本和大版本号
表示当前 Class 文件是由那个版本的编译器编译产生的 分别2字节标识
Class 文件版本号和平台的对应
java 虚拟机向下兼容 高版本的虚拟机可以执行由低版本编译器生成的 class 文件
除了1.1版本的虚拟机 对应的小版本号不为0 其他编译器版本的小版本号都为0
在读取并校验魔数通过之后会读取版本号并进行校验
常量池
跟在版本号后面的是 Class 文件的常量池信息
constant_pool_count
常量池的大小 标识该 Class 文件有多少个常量池表项 常量池0为空缺项 不存放实际内容
constant_pool
常量池表项信息 每个表项由 tag 值标识
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 属性
表示 类方法或字段在未来版本中将被废弃