javaclass文件
javaclass文件是对java程序二进制文件格式的精确定义,它使得所有java虚拟机都能够正确地读取和解释。
class文件内容
javaclass文件包含了java虚拟机所需要知道的,关于类或者接口的所有信息。
ClassFile是可变表
magic
class文件的前4个字节,0xCAFEBABE。它可以辨别出javaclass文件和非class文件。
minor_version和major_version
主次版本号。
constant_pool和constant_pool_count
常量池包含了类和接口的常量。在实际列表constant_pool之前,是入口在列表中的计数constant_pool_count
每个常量池入口都从一个长度为一个字节的标志开始的,一旦java虚拟机获取并解析这个标志,java虚拟机就会知道在标志后的常量类型是什么。
access_flags
this_class
它是一个对常量池的索引,这个位置的常量池必须是CONSTANT_Class_info表。表由两个部分组成 :标签和name_index, 标签部分是一个具有CONSTANT_Class值常量,在name_index位置的常量池入口为一个包含了类或接口全限定名的CONSTANT_Utf8_info表。
super_class
两个字节的常量池索引,指向类超类的全限定名的CONSTANT_Class_info入口。除了Object类以外,常量池索引super_class对于所有的类均有效,对于Object类,super_class的值为0,对于接口,在常量池入口super_class位置项为java.lang.Object
interfaces_count和interfaces
文件中出现在该类的直接实现或者由接口所扩展的父接口的数量。计数后面是interfaces数组,包含了对每个由该类或者接口直接实现的父接口的常量池索引。
fields_count和 fields
在class文件中,紧接在interfaces后面是对类或者接口中所声明的字段的描述。fields_count类变量和实例变量的总和。后面是不同长度的field_info表的序列(fields_count指出序列中有多少个field_info表)。
methods_count和methods
对于该类或者接口中声明的方法的描述。
methods_count是一个双字节长度的对于该类型或者接口中声明的所有方法的总计数。
后面是方法本身,它在一个method_info表的列表中进行了阐述(methods_count指出了列表中有多少个method_info表)
method_info表包含了与方法相关的一些信息,包括方法名和描述符。
attributes_count和attributes
文件中类或者接口所定义的属性的基本信息。属性部分由attributes_count开始,attributes_count是指出现在后续attributes列表中的attribute_info表的数量总和。attribute_info的第一项指向常量池中CONSTANT_Class_info表的索引,该表给出了属性的名称。java虚拟机定义了两种属性 sourcecode和innerclasses
特殊字符串
常量池中容纳符号引用包括三种特殊字符串:全限定名,简单名称和描述符。
全限定名 当常量池入口指向类或者接口时,它们给出类或者接口的全限定名。
简单名称 字段名和方法名以简单名称(非全限定名)形式出现在常量池入口中。
描述符 除了类和接口的全限定名和简单字段(或方法)名,指向字段和方法的符号引用还包含描述字符串。字段描述符给出了字段的类型,方法描述符给出了方法的返回值和方法参数的数量,类型以及顺序。
常量池
常量池是一个可变长度cp_info表的有序序列。
CONSTANT_Utf8_info表
常量池
常量池是一个可变长度cp_info表的有序序列。这些cp_info表通常形式
cp_info表中tag(标志)项是一个无符号的byte 类型值,它表明了表的类型和格式。cp_info表一共有11种类型
CONSTANT_Utf8_info表
使用一种UTF-8格式的变体来存储一个常量字符串。这种类型的表可以存储多种字符串。
文字字符串
被定义的类和接口的全限定名
被定义的类的超类的全限定名
被定义的类和接口的父接口的全限定名
由类或者接口声明的任意字段的简单名称和描述符
由类或者接口声明的任意方法的简单名称和描述符
任何引用的类和接口的全限定名
任何引用的字段的简单名称和描述符
任何引用的方法的简单名称和描述符
与属性相关的字符串
CONSTANT_Utf8_info表中存储了四种基本信息类型:文字字符串,被定义的类和接口描述,对其它类或者接口的符号引用以及属性相关的字符串。一些属性相关的字符串
unicode字符两个字节表示,ASCII字符一个字节表求
tag项的值为CONSTANT_Utf8(1)
length给出了后续bytes项的长度
bytes项中包含按照变体UTF-8格式存储的字符串中的字符。从’\u0001’到’\u007f’的所有字符一个字节表示
从’\u0800’到’\uffff’的所有字符三个字节表示
CONSTANT_Integer_info
用来存储常量int类型值,只存储int值,不存储符号引用
tag项的值为CONSTANT_Integer(3)
bytes 按照高位在前的格式存储int类型的值
CONSTANT_Float_info
CONSTANT_Long_info
CONSTANT_Double_info
CONSTANT_Class_info
tag项的值为CONSTANT_Class(7)
name_index 项给出了包含类或接口的全限定名的CONSTANT_Utf8_info表的索引。
CONSTANT_String_info表
CONSTANT_Fieldref_info
class_index 给出了声明被引用字段的类或者接口的CONSTANT_Class_info入口索引。
name_and_type_index 提供了CONSTANT_NameAndType_info入口索引,该入口提供了字段的简单名称以及描述符。
CONSTANT_Methodref_info
CONSTANT_InterfaceMethodref_info
CONSTANT_NameAndType_info 构成了指向字段或者方法的符号引用的一部分。
字段
在类或者接口中声明的每一个字段都由class文件中的一个名为field_info的可变长度的表进行描述。
方法
属性
Code属性
可变长度的Code_attribute 表定义了方法的字节码序列和其它信息。在所有不是抽象或者本地方法的method_info信息中,都存在一个Code_attribute表。
具体项含义参看书中解释。
ConstantValue属性
固定长度的ConstantValue属性出现在值为常量的字段field_info表中。详见书。
Deprecated属性
固定长度的Deprecated属性存在field_info,method_info和ClassFile表内的attributes项中,是一个可选的项,指出了禁用的字段,方法或者类型 详见书。
Exceptions属性
可变长度的Exceptions属性列出了方法可能抛出的异常。
InnerClasses属性
可变长度的InnerClasses属性对名字,访问标志以及被声明为成员的任何嵌入类型的外围类型,或者用别的方法由类或者接口陈述的类型。
LineNumberTable属性
可变长度LineNumberTable属性建立了方法字节码流偏移量和源代码行号之间的映射关系。
LocalVariableTable属性
可变长度LocalVariableTable属性建立了方法的栈帧局部变量部分内容与源代码中局部变量的名称和描述符之间的映射关系。
SourceFile属性
固定长度SourceFile属性可能存在于ClassFile表内属性项中,它是一个可选的项,它提供了产生class文件的源文件的名称。
Synthetic属性
固定长度Synthetic属性可能存在于field_info,method_info和ClassFile表内的atrributes项中,它是一个可选的项,它指明了为编译器产生的字段,方法,或者类型。