介绍
class虚拟机实现可以从文件系统(环境变量)读取也可以从JAR(或者ZIP)包提取,也可以从网上下载,从数据库加载,甚至在运行中直接生成class文件。
文件由8位字节流组成。16位和32位的数量分别通过读入两个和四个连续的8位字节来构造。多字节数据项总是以大端顺序存储,其中高字节放在前面。
结构
文件由单个结构组成:class
ClassFile
ClassFile {u4 magic;u2 minor_version;u2 major_version;u2 constant_pool_count;cp_info constant_pool[constant_pool_count-1];u2 access_flags;u2 this_class;u2 super_class;u2 interfaces_count;u2 interfaces[interfaces_count];u2 fields_count;field_info fields[fields_count];u2 methods_count;method_info methods[methods_count];u2 attributes_count;attribute_info attributes[attributes_count];
}
各个字段含义如下:
- magic:提供用以分辨ClassFile格式的数,值为 0xCAFEBABE
- minor_version(次要版本号), major_version(主要版本号):
- 这个类文件的次要和主要版本号。主版本号和次版本号一起决定了类文件格式的版本。如果一个类文件的主要版本号为M,次要版本号为m,我们将其类文件格式的版本表示为M.m。
-
对于major_version为56或以上的类文件,minor_version必须为0或65535。对于major_version在45到55之间的类文件,minor_version可以是任何值。
-
constant_pool_count:该项的值等于表中条目的数量加1。如果索引大于0且小于条目数,则认为索引有效,但type和常量除外。
-
constant_pool[]:
-
是一个结构表,表示在结构及其子结构中引用的各种字符串常量、类和接口名、字段名和其他常量。每个表项的格式由其第一个“标记”字节表示。
-
表的索引从1到- 1。
-
-
access_flags:该项的值是用于表示该类或接口的访问权限和属性的标志的掩码
-
this_class:该项的值必须是表中的有效索引。该索引的入口必须是一个结构体,表示这个文件定义的类或接口。
-
super_class:
-
对于一个类(class),super_class 表示该类的直接超类(direct superclass)。super_class 的值必须要么是零,要么是指向表中有效位置的索引。如果 super_class 的值不为零,那么在该索引处的条目必须是表示该类的直接超类的结构。而且,该直接超类及其任何超类都不得在其结构的项目中设置标志。
-
如果 super_class 的值为零,那么这个类代表的是
java.lang.Object
,这是唯一一个没有直接超类的类。 -
对于一个接口(interface),super_class 的值必须始终是一个有效的表索引。在该索引处的条目必须是表示
java.lang.Object
的结构。
-
-
interfaces_count:该项的值给出了该类或接口类型的直接超接口的数量。
-
interfaces[]:数组中的每个值必须是一个有效的表索引。对于每个值 i,其中 0 ≤ i < 数组长度,该值对应的条目必须是表示一个直接超接口(direct superinterface)的结构,这个超接口是该类或接口类型的一个直接超接口。这些超接口的顺序应该按照源代码中给定的左到右顺序排列。
-
fields_count:该项的值给出了表中结构的数量。这些结构表示由这个类或接口类型声明的所有字段,包括类变量和实例变量。
-
fields[]:表中的每个值必须是一个结构,给出该类或接口中字段的完整描述。该表只包含由这个类或接口声明的字段。它不包括表示从超类或超接口继承的字段的项。
-
methods_count:该项的值给出了表中结构体的数量。
-
methods[]:
-
每个表中的值必须是一个结构,给出了该类或接口中一个方法的完整描述。这个结构包括方法的访问标志(access_flags)、方法名称、描述符等信息。如果结构中的 flags 中没有设置 ACC_NATIVE 或 ACC_ABSTRACT 标志,那么还会提供实现该方法的 Java 虚拟机指令。
-
这些结构代表了该类或接口类型声明的所有方法,包括实例方法、类方法、实例初始化方法以及任何类或接口初始化方法。表中不包括代表从超类或超接口继承的方法的条目。
-
method_info 结构包含了关于方法的详细信息,如方法的修饰符、名称、描述符等。每个 method_info 结构表示一个方法。
-
-
attributes_count:该项的值给出了该类表中的属性数。
-
attributes[]:
-
表的每个值必须是一个结构(§4.7)。attributesattribute_info
-
表4.7-C中列出了本规范定义的在结构表中出现的属性。attributesClassFile
-
关于定义在结构表中出现的属性的规则在§4.7中给出。attributesClassFile
-
关于结构表中非预定义属性的规则在§4.7.1中给出。attributesClassFile
-