深入理解Android:Java虚拟机ART
上QQ阅读APP看书,第一时间看更新

2.1 Class文件格式总览

在Java虚拟机规范 JAVA VM官方规范,https://docs.oracle.com/javase/specs/jvms/se7/html/index.html,JAVA VM官方规范中,Class文件有着严格的格式。图2-1为Java虚拟机规范第四章“Class文件格式”中对Class文件格式的描述。

图2-1 Class文件格式全貌

图2-1所示为Class文件格式的全貌,下面我们分类来介绍各个字段。

·根据规范,Class文件前8个字节依次是magic(4个字节长,取值必须是0xCAFEBABE)、minor_version(2个字节长,表示该class文件版本的小版本信息)和major_verion(2个字节长,表示该class文件版本的大版本信息)。

·constant_pool_count表示常量池数组中元素的个数,而constant_pool是一个存储cp_info信息(cp为constant pool缩写,译为常量池)的数组。每一个Class文件都包含一个常量池。常量池在代码中对应为一个数组,其元素的类型就是cp_info。注意,cp数组的索引从1开始。

·access_flags:标明该类的访问权限,比如public、private之类的信息。

·this_class和super_class:存储的是指向常量池数组元素的索引。通过这两个索引和常量池对应元素的内容,我们可以知道本类和父类的类名(只是类名,不包含包名。类名最终用字符串描述)。

·interfaces_count和interfaces:这两个成员表示该类实现了多少个接口以及接口类的类名。和this_class一样,这两个成员也只是常量池数组里的索引号。真正的信息需要通过解析常量池的内容才能得到。

·fields_count和fields:该类包含了成员变量的数量和它们的信息。成员变量信息由field_info结构体表示。

·methods_count和methods:该类包含了成员函数的数量和它们的信息。成员函数信息由method_info结构体表示。

·attributes_count和attributes:该类包含的属性信息。属性信息由attributes_info结构体表示。属性包含哪些信息呢?比如:调试信息就记录了某句代码对应源文件哪一行、函数对应的Java字节码也属于属性信息的一种。另外,源文件中的注解也属于属性。

提示 u4:表示这个域长度为4个字节,内容为无符号整数

u2:表示这个域长度为2个字节,内容为无符号整数

有了图2-1所示的class文件格式,我们可以很轻松地解析一个Class文件。在此之前,图2-1中还有一些重要知识需要先介绍。

·常量池包括常量项的类型和几种主要常量项和它们之间的关系。

·用于描述成员变量的field_info和成员函数的method_info。

·访问标志(access_flag)。

·属性信息。