Class类文件结构
- Class 文件是一组以 8 字节为基础单位的二进制流
- 各个数据项目严格按照顺序紧凑排列在 class 文件中
- 中间没有分隔符,这使得 class 文件中存储的内容几乎是全部程序运行的程序
包括两种类型:无符号数 和 表
无符号数
- 属于基本数据类型
- 按照 UTF-8 编码构成的字符串,大小使用 u1/u2/u4/u8 表示1字节、2字节、4字节、8字节
表
在class文件中,主要分为魔数、Class文件的版本号、常量池、访问标志、类索引(还包括父类索引和接口索引集合)、字段表集合、方法表集合、属性表集合
魔数
每个 Class 的文件头的4个字节成为魔数 (Magic Number )
唯一作用是用于确定这个文件是否为一个能被虚拟机接受的 Class 文件
Class 文件魔数的值为 0xCAFEBABE。如果一个文件不是以 0xCAFEBABE 开头,那么他肯定就不是 Java class 文件
Class文件的版本号
次版本号(minor version):前 2 字节用于表示次版本号
主版本号(major version):后 2 字节用于表示主版本号
对应着 JDK 的版本号
常量池
常量池 简单理解为 class 文件的资源从库
- 常量池容量计数值(constant pool count): 常量的数量
- 数据集合 (constant_pool): 数量 = constant pool count - 1
- 字面量:文本字符串、被声明为final的常量值
- 符号引用
- 类和接口的全限定名
- 字段的名称和描述符
- 方法的名称和描述符
访问标志
主要用于识别一些类或接口层次的访问信息
- 是否 final
- 是否 pubIic private
- 是否是接口
- 是否是 abstact
- 是否是注解
- 是否是枚举
类索引、父类索引、接口索引集合
确定类的继承关系
类索引(this_class):用于确定这个类的全限定名,占2字节
父类索引(super_class):用于确定这个类父类的全限定名【不允许多重继承】
接口索引计数器(interfaces_count): 如果该类没有实现接口,则该数字为 0
接口索引集合 (interfaces): 实现的哪些接口
字段表集合
- 字段表计数器(fields_count): 字段表数据个数
- 字段表集合(fields): 描述声明的变量
- public、protected、private
- static
- final
- volatile
方法表集合
- 方法表计数器(methods_count): 方法数据个数
- 方法表集合(methods): 表示方法的集合
属性表集合
属性表集合不要求其中包含的属性表具有严格的顺序,并且只要属性的名称不与已有的属性名称重复,任何人实现的编译器可以向属性表中写入自己定义的属性信息。