深入java虚拟机读书笔记(二)

                                          第六章 java class 文件

6.1 java class文件是什么

     javaclass文件是对java程序二进制文件格式的精确定义,每一个java class文件都对一个java类或者java接口做出了全面描述。

6.1 class文件的内容


深入java虚拟机读书笔记(二)
 (1)magic number

java class文件的前四个字节是魔数:0XCAFEBABE,用于分辨java class文件和非class文件

 

(2)minor_version 和 major_version

次版本号 和 主版本号,一共占用四个字节。

 

(3)constant_pool_count 和 constant_pool

常量池数量和常量池。

常量池:常量池中包含了文字字符串,final变量值,类名和方法名的常量。常量池是由一个数组组成。

每个常量池入口都从长度为一个字节的标志开始,这个标志指出了列表中该位置的常量类型。


深入java虚拟机读书笔记(二)
 更具体的常量池分析请参考:http://foxxiao.iteye.com/admin/blogs/849932

 

(4)access_flags

展示了文件中定义的类或接口的几段信息。


深入java虚拟机读书笔记(二)
 

(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表的有序序列。