1. 简介
Class文件是一种与平台无关的字节码文件,每一个Class文件都对应一个类或接口的定义信息,它包含了Java虚拟机指令集和符号表以及其他辅助信息。Class文件只与Java虚拟机有关,可以由不同的语言编写的源代码编译而来。
2. 结构
Class文件是一组以8个字节为基础单位的字节流。在下表的数据项中:
- u1、u2、u4、u8类型分别代表1个字节、2个字节、4个字节、8个字节的无符号数
- _info结尾的类型是表类型,是由多个无符号数或其他表作为数据项的复合数据类型
类型 | 名称 | 数量 |
---|---|---|
u4 | magic(魔数) | 1 |
u2 | minor_version(副版本号) | 1 |
u2 | major_version(主版本号) | 1 |
u2 | constant_pool_count(常量池计数器) | 1 |
cp_info | constant_pool(常量池) | constant_pool_count-1 |
u2 | access_flags(访问标志) | 1 |
u2 | this_class(类索引) | 1 |
u2 | super_class(父类索引) | 1 |
u2 | interfaces_count(接口计数器) | 1 |
u2 | interfaces(接口表) | interfaces_count |
u2 | fields_count(字段计数器) | 1 |
field_info | fields(字段表) | fields_count |
u2 | methods_count(方法计数器) | 1 |
method_info | methods(方法表) | methods_count |
u2 | attributes_count(属性计数器) | 1 |
attribute_info | attributes(属性表) | attributes_count |
数据项含义
magic(魔数)
每个Class文件头4个字节就是魔数,魔数的作用是确定这个文件是否为一个能被虚拟机所接受的Class文件。魔数的值固定为0xCAFEBABE。
主版本号 & 副版本号
主副版本号共同构成了Class文件的版本号,规定了这个版本号的Class文件只能由不低于这个版本号的虚拟机执行。
constant_pool_count(常量池计数器)
常量池计数器的值代表了常量池的容量。这里需要注意一点常量池的容量比常量池的常量数据项还要多1,因为常量池常量的索引是从1开始的。举个例子:常量池有8个常量,那么常量池的索引就是1-8,空出了0这个索引,那么常量池计数器表示为常量池容量就为9(即0-8)。
constant_pool(常量池)
常量池中主要存放两大类常量:
- 字面值
- 字符串
- 声明为
final
的常量
- 符号引用
- 类和接口的全限定名
- 字段的名称和描述符
- 方法的名称和描述符
access_flags(访问标志)
访问标志用于表示某个类或者接口的访问权限及基础属性
类索引(this_class)
类索引的是一个u2类型的数据项,它的值表示指向常量池中当前类或接口的索引,即一个CONSTANT_Class_info类型的符号引用。
super_class(父类索引)
父类索引的是一个u2类型的数据项,它的值表示指向常量池中父类的索引,即一个CONSTANT_Class_info类型的符号引用。
interfaces_count(接口计数器)
接口计数器表示该类或接口实现的接口数量
interfaces(接口表)
一个数据项类型为u2的集合,每一项表示指向常量池中接口的索引,即一个CONSTANT_Class_info类型的符号引用。
fields_count(字段计数器)
字段计数器表示类或接口声明的变量的数量,不包括方法中声明的变量。
fields(字段表)
一个数据项类型为field_info的集合,描述了各个字段,field_info的结构如下:
类型 | 名称 | 数量 |
---|---|---|
u2 | access_flags(访问标记,修饰符) | 1 |
u2 | name_index(常量池中该字段简单名称的索引) | 1 |
u2 | descriptor_index(常量池中该字段描述符的索引) | 1 |
u2 | attributes_count | 1 |
attribute_info | attributes | attributes_count |
methods_count(方法计数器)
方法计数器表示类或接口中定义的方法数量
methods(方法表)
一个数据项类型为method_info的集合,描述了各个方法,field_info的结构如下:
类型 | 名称 | 数量 |
---|---|---|
u2 | access_flags(访问标记,修饰符) | 1 |
u2 | name_index(常量池中该字段简单名称的索引) | 1 |
u2 | descriptor_index(常量池中该字段描述符的索引) | 1 |
u2 | attributes_count | 1 |
attribute_info | attributes | attributes_count |