深入java虚拟机读书笔记(二),
深入java虚拟机读书笔记(二),
第六章 java class 文件
6.1 java class文件是什么
javaclass文件是对java程序二进制文件格式的精确定义,每一个java class文件都对一个java类或者java接口做出了全面描述。
6.1 class文件的内容
(1)magic number
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
- interfaces_count
紧接super_class, 含义:在文件中由该类直接实现或者由接口所扩展的父接口的数量。
- interfaces
是个数组,包含了对每个该类或者接口直接实现的父接口的常量池索引。每个父接口使用一个CONSTANT_CLASS_INFO入口来描述。这个数组织容纳那些直接出现在类声明的implements子句或者接口声明的extends子句中的父接口。超类按照在implements子句和extentds字句中出现的顺序(从左到又)在这个数组中显现。
- fields_count和fields
紧接在interfaces后面的是对该类或者接口中所声明的字段的描述。每个field_info表都展示了一个字段信息。此表包含了字段的名字、描述符和修饰符。这样的信息有些放在field_info表中,有些放在field_info表所指向的常量池中。
- method_count和methods
描述类接口中声明的方法.
method_count:双字节长度,对于该类或者接口中声明的所有方法的总计数(不包括父超类或者父接口中继承来的方法)。
method_info表包含了与方法相关的一些信息,包括方法名和描述符(方法的返回值类型和参数类型)。具体参看书P126.
- attributes_count和attributes
它给出了该文件中类或者接口所定义的属性的基本信息。
6.3 特殊字符串
常量池中容纳的符好引用包括三种特殊的字符串:全限定名、简单名称和描述符。
- 全限定名:当常量池入口指向类或者接口时,它们给出该类或者接口的全限定名。在class文件中,全限定名用斜线取代了。
- 简单名称:字段名和方法名以简单名称形式出现在常量池入口中。
- 描述符:指向字段的符好引用还包含描述符字符串。字段的描述符给出了字段的类型;方法描述符给出了方法的返回值和方法参数的数量、类型以及顺序。
6.4 常量池
常量池是一个可变长度cp_info表的有序序列。
相关文章
- 暂无相关文章
用户点评