第六章 java class 文件
javaclass文件是对java程序二进制文件格式的精确定义,每一个java class文件都对一个java类或者java接口做出了全面描述。
java class文件的前四个字节是魔数:0XCAFEBABE,用于分辨java class文件和非class文件
(2)minor_version 和 major_version
次版本号 和 主版本号,一共占用四个字节。
(3)constant_pool_count 和 constant_pool
常量池数量和常量池。
常量池:常量池中包含了文字字符串,final变量值,类名和方法名的常量。常量池是由一个数组组成。
每个常量池入口都从长度为一个字节的标志开始,这个标志指出了列表中该位置的常量类型。
更具体的常量池分析请参考:http://foxxiao.iteye.com/admin/blogs/849932
(4)access_flags
展示了文件中定义的类或接口的几段信息。
(5)this_class
this_class占用2个字节,它是一个对常量池的索引。
当java虚拟机在this_class位置查阅常量池入口的时候,它会发现一个通过把自己的标签设为constant_class来识别自身的项。
(6)super_class
紧接this_class项,两字节的常量池索引,在super_class位置的常量池入口是一个指向该类超类限定名的CONSTANT_CLASS_INFO入口。对于object类,super_class为0。
(7)interfaces_count和interfaces
紧接super_class, 含义:在文件中由该类直接实现或者由接口所扩展的父接口的数量。
是个数组,包含了对每个该类或者接口直接实现的父接口的常量池索引。每个父接口使用一个CONSTANT_CLASS_INFO入口来描述。这个数组织容纳那些直接出现在类声明的implements子句或者接口声明的extends子句中的父接口。超类按照在implements子句和extentds字句中出现的顺序(从左到又)在这个数组中显现。
紧接在interfaces后面的是对该类或者接口中所声明的字段的描述。每个field_info表都展示了一个字段信息。此表包含了字段的名字、描述符和修饰符。这样的信息有些放在field_info表中,有些放在field_info表所指向的常量池中。
描述类接口中声明的方法.
method_count:双字节长度,对于该类或者接口中声明的所有方法的总计数(不包括父超类或者父接口中继承来的方法)。
method_info表包含了与方法相关的一些信息,包括方法名和描述符(方法的返回值类型和参数类型)。具体参看书P126.
它给出了该文件中类或者接口所定义的属性的基本信息。
常量池中容纳的符好引用包括三种特殊的字符串:全限定名、简单名称和描述符。
常量池是一个可变长度cp_info表的有序序列。