Class 文件包含了 Java 虚拟机的指令集、符号表、辅助信息的字节码(Byte Code),是实现跨操作系统和语言无关性的基石之一。
一个 Class 文件定义了一个类或接口的信息,是以 8 个字节为单位,没有分隔符,按顺序紧凑排在一起的二进制流。
用 "无符号数" 和 "表" 组成的伪结构来存储数据。
- 无符号数:基本数据类型,用来描述数字、索引引用、数量值、字符串值,如u1、u2 分别表示 1 个字节、2 个字节
- 表:无符号数和其他表组成,命名一般以 "_info" 结尾
成部分
1、魔数 Magic Number
- Class 文件头 4 个字节,0xCAFEBABE
- 作用是确定该文件是 Class 文件
2、版本号
- 4 个字节,前 2 个是次版本号 Minor Version,后 2 个主版本号 Major Version
- 从 45 (JDK1.0) 开始,如 0x00000032 转十进制就是 50,代表 JDK 6
- 低版本的虚拟机跑不了高版本的 Class 文件
3、常量池
- 常量容量计数值(constant_pool_count),u2,从 1 开始。如 0x0016 十进制 22 代表有 21 项常量
- 每项常量都是一个表,目前 17 种
- 特点:Class 文件中最大数据项目之一、第一个出现表数据结构
4、访问标志
- 2 个字节,表示类或接口的访问标志
5、类索引、父类索引、接口索引集合
- 类索引(this_class)、父类索引(super_class),u2
- 接口索引集合(interfaces),u2 集合
- 类索引确定类的全限定名、父类索引确定父类的全限定名、接口索引集合确定实现接口
- 索引值在常量池中查找对应的常量
6、字段表(field_info)集合
- 描述接口或类申明的变量
- fields_count,u2,表示字段表数量;后面接着相应数量的字段表
- 9 种字段访问标志
7、方法表(method_info)集合
- 描述接口或类申明的方法
- methods_count,u2,表示方法表数量;后面接着相应数量的方法表
- 12 种方法访问标志
- 方法表结构与字段表结构一致
8、属性表(attribute_info)集合
- class 文件、字段表、方法表可携带属性集合,描述特有信息
- 预定义 29 项属性,可自定义写入不重名属性