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(常量池)

常量池中主要存放两大类常量:

  1. 字面值
    • 字符串
    • 声明为final的常量
  2. 符号引用
    • 类和接口的全限定名
    • 字段的名称和描述符
    • 方法的名称和描述符

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