笔记目录
1.Class文件结构
Class文件具有平台无关性,所有运行平台的字节码文件格式都是统一的。Class文件也具有向后兼容的特性,Class文件结构在JDK1.2的时候就已经规定好了。
Class文件是一组以8字节为单位的二进制流文件,各个数据项按照严格的顺序排列,中间没有任何的分隔符,Class文件有两种数据类型:
无符号数
:基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节、8个字节的无符号数,无符号数可以用来描述数字、引用等。
表
:表是由多个无符号数或者其它表作为数据项构成的符合数据类型,以"_info"结尾标识。
1.1 魔数cafe babe和Class文件版本
每个Class文件的前4个字节称之为魔数,固定是CAFE BABE
,它是确定这个文件是不是一个Class文件的标识。
紧接着魔数的后4个字节分别是次版本号、主版本号,JDK的主版本号是从45开始,以后每次升级就是+1。
1.2 常量池
常量池中的常量数量是不固定的,常量池入口用u2类型表示,占用2个字节,这个常量池容量是从1开始记而不是0。常量池里面主要存放两大类常量:字面量和符号引用。
1.2.1 字面量
类文件中定义的文本字符串、常量值等。
1.2.2 符号引用
类和接口的全限定名、字段的名称和描述符、方法的名称和描述符等。
1.3 访问标志
紧接着2个字节用于标识一些类或者接口层次的访问信息,例如class是类还是接口、是否是public、是否是抽象类、是否是不可变类等。
1.4 类索引、父类索引和接口索引集合
类索引和父类索引是一个u2类型表示,接口索引集合是一组u2结构表示,Class文件通过这三个信息来确定该类的继承关系。
1.5 字段表集合
描述接口或者类中声明的变量Field,包括类变量和成员变量,但是不会包括父类的字段。
1.6 方法表集合
描述了方法的定义,包括访问标志、名称索引、描述符索引、属性表集合等。
1.7 属性表集合
Class文件、字段表集合、方法表集合都有自己的属性表集合,用来描述专有信息,例如方法表集合的代码指令就存在Code属性表里。