一、classFile 结构
编译后被Java虚拟机所执行的代码使用了一种平台中立(不依赖于特定硬件及操作系统)的二进制格式来表示,并且经常以文件的形式存储,因此这种格式称为class 文件格式。class 文件格式精确地定义了类与接口的表示形式,包括在平台相关的目标文件格式中一些细节上的惯例,例如字节序(byte ording) 等
每一个 class 文件都对应着唯一一个类或接口的定义信息,但是相对地,类或接口并不一定都必须定义在文件里(比如:类或接口可以通过类加载器直接生成)。
每个 class 文件都由字节流组成,每个字节包含8个二进制位,所有16位、32位和64位长度的数据将通过构造2个、4个和8个连续的8位字节来表示。
Magic(魔数)
minor_version(副版本号)、major_version(主版本号)
主副版本号构成了 class 文件的格式版本号。 Java 虚拟机实现会遵循 Java SE 平台的某个发行版级别,而这个发行版级别决定了本虚拟机所能支持的版本范围。
constant_pool_count(常量池计数器)
constant_pool_count 值等于常量池中的成员数 + 1。 常量池表的索引值只有在大于 0 且小于 constant_pool_count 时才会认为是有效的,对于 long 和 double 类类型有例外情况。
constant_pool[](常量池)
constant_pool 是一种表结构,包含 class 文件结构及其子结构中引用的所有字符常量、类、接口名、字段名和其他常量。
常量池中的每一项都具备相同的特征- 第一个字节作为类型标记,用于确定该项的格式,这个字节称为 tag byte(标记字节、标签字节) 常量池以 1~constant_pool_count-1 为索引
access_flags(访问标志)
access_flags 是一种由标志所构成的掩码,用于表示某个类或者接口的访问权限及属性。 如:ACC_PUBLIC 值为 0x001 ,表示声明为 public
this_class(类索引)
this_class 值必须是对常量池表中某项的一个有效索引值。 常量池在这个索引处的成员必须为 CONSTANT_Class_info 类型结构体,该结构体表示这个 class 文件所定义的类或接口。
super_class(父类索引)
对于类来说,super_class 的值要么是0 ,要么是对常量池表中某项的一个有效索引值。 super_class = 0 表示该 class 文件是 Object 类,因为它是唯一没有父类的类。
interface_count(接口计数器)
interfaces_count 项的值表示当前类或接口的直接超接口数量。
interfaces[](接口表)
interfaces[]中每个成员的值必须是对常量池表中某项的有效索引值,他的长度为 interfaces_count。
每个成员 interfaces[i]必须为 CONSTANT_Class_info结构。
在 interfaces[] 中,各成员所表示的接口顺序和对应的源代码中给定的接口顺序(从左至右)一样,即 interfaces[0]对应的是源代码中最左边的接口
fields_count(字段计数器)
fields_count 值表示当前 class 文件 fields 表的成员个数。
fields 表中每个成员都是一个 field_info 结构,由于表示该类或接口所声明的类字段或者实例字段。
fiedls
fields 表中的每个成员必须是要给 fields_info 结构的数据项,用于表示当前类或接口中某个字段的完整描述。 fields 表描述当前类或借口声明的所有字段,但不包括从父类或接口继承的那些字段。
methods_count(方法计数器)
methods_count 值表示当前 class 文件 methods 表的成员个数。
methods
methods 表中的每个成员你都必须是一个 method_info 结构,由于表示当前类或接口中某个方法的完整描述。
如果某个 method_info 结构的 access_flags 项既没有设置 ACC_NATIVE 标志也没有设置 ACC_ABSTRACT 标志,那么该结构中也应该包含这个方法所用的Java虚拟机指令。
method_info 结构可以表示类或接口中定义的所有方法,包括实例方法、类方法、实例初始化方法和类或接口初始化方法。
methods 表只描述当前类或接口中声明的方法,不包括从父类或父接口继承的方法。
attributes_count(属性计数器)
attributes_count 值表示当前class文件属性表的成员个数。
attributes
属性表的每个项的值必须是 attribute_info 结构