首页 > 代码库 > JVM系列(之class文件)

JVM系列(之class文件)

JVM系列(之class文件)

Class文件结构

class文件结构

class文件采用一种伪结构(无符号数:描述数字、索引引用、数量值或按UTF-8编码的字符串值,表:由多个无符号数或其他表构成的复合型数据结构,整个class文件就是一个表)进行存储。

文件结构说明

  • 魔数:每个class文件的前4个字节,用于确定这个文件是否是一个可被虚拟机接受的class文件。
  • 常量池:第一个u2数据表示常量的个数,索引从1开始。将索引0空出是为了让指向常量池索引的在特殊情况下表示不引用常量池的项目。每个常量都是一个以u1开头的表(1-12去掉2,表示属于哪种常量),每个常量都有自己的结构。

      字面量:文本字符串,final声明的常量。

       符号引用:类和接口的全限定名;字段的名称和描述符;方法的名称和描述符。

      javap –verbose classfile输出class详细描述信息。

   

  • 访问标志:识别一些类或接口的访问信息。

   

  • 类索引、父类索引、接口索引:由这三个数据来确定类的继承关系。

    类索引和父类索引各自指向一个CONSTANT_Class_info的类型常量。

  • 字段表集合:描述接口或类中声明的变量,不包括方法内部的变量。

   

    access_flags:表示作用域(public/protected/private),实例变量(static),可变性(final),可并发性(volatile),序列化(transient)

    name_index:表示简单名称,

    descriptor_index:表示方法和字段的描述符,描述字段的数据类型,方法的参数列表和返回值。

    attribute_count:表示属性个数,如果大于1则后面还接属性信息attribute_info.

  • 方法表集合:字段格式与字段表集合格式一样。
  • 属性表集合

   

  attribute_name_index:属性名称的索引,会索引常量池里面的一个CONSTANT_Utf8_info的一个常量。

 

JVM系列(之class文件)