详细说说JVM的class文件(一)

介绍

class虚拟机实现可以从文件系统(环境变量)读取也可以从JAR(或者ZIP)包提取,也可以从网上下载,从数据库加载,甚至在运行中直接生成class文件。

文件由8位字节流组成。16位和32位的数量分别通过读入两个和四个连续的8位字节来构造。多字节数据项总是以大端顺序存储,其中高字节放在前面。

结构

文件由单个结构组成:classClassFile

ClassFile {
    u4             magic;
    u2             minor_version;
    u2             major_version;
    u2             constant_pool_count;
    cp_info        constant_pool[constant_pool_count-1];
    u2             access_flags;
    u2             this_class;
    u2             super_class;
    u2             interfaces_count;
    u2             interfaces[interfaces_count];
    u2             fields_count;
    field_info     fields[fields_count];
    u2             methods_count;
    method_info    methods[methods_count];
    u2             attributes_count;
    attribute_info attributes[attributes_count];
}

各个字段含义如下:

  1. magic:提供用以分辨ClassFile格式的数,值为 0xCAFEBABE
  2. minor_version(次要版本号), major_version(主要版本号):
    1. 这个类文件的次要和主要版本号。主版本号和次版本号一起决定了类文件格式的版本。如果一个类文件的主要版本号为M,次要版本号为m,我们将其类文件格式的版本表示为M.m。
    2. 对于major_version为56或以上的类文件,minor_version必须为0或65535。对于major_version在45到55之间的类文件,minor_version可以是任何值。

  3. constant_pool_count:该项的值等于表中条目的数量加1。如果索引大于0且小于条目数,则认为索引有效,但type和常量除外。

  4. constant_pool[]:

    1. 是一个结构表,表示在结构及其子结构中引用的各种字符串常量、类和接口名、字段名和其他常量。每个表项的格式由其第一个“标记”字节表示。

    2. 表的索引从1到- 1

  5. access_flags:该项的值是用于表示该类或接口的访问权限和属性的标志的掩码

  6. this_class:该项的值必须是表中的有效索引。该索引的入口必须是一个结构体,表示这个文件定义的类或接口。

  7. super_class:

    1. 对于一个类(class),super_class 表示该类的直接超类(direct superclass)。super_class 的值必须要么是零,要么是指向表中有效位置的索引。如果 super_class 的值不为零,那么在该索引处的条目必须是表示该类的直接超类的结构。而且,该直接超类及其任何超类都不得在其结构的项目中设置标志。

    2. 如果 super_class 的值为零,那么这个类代表的是 java.lang.Object,这是唯一一个没有直接超类的类。

    3. 对于一个接口(interface),super_class 的值必须始终是一个有效的表索引。在该索引处的条目必须是表示 java.lang.Object 的结构。

  8. interfaces_count:该项的值给出了该类或接口类型的直接超接口的数量。

  9. interfaces[]:数组中的每个值必须是一个有效的表索引。对于每个值 i,其中 0 ≤ i < 数组长度,该值对应的条目必须是表示一个直接超接口(direct superinterface)的结构,这个超接口是该类或接口类型的一个直接超接口。这些超接口的顺序应该按照源代码中给定的左到右顺序排列。

  10. fields_count:该项的值给出了表中结构的数量。这些结构表示由这个类或接口类型声明的所有字段,包括类变量和实例变量。

  11. fields[]:表中的每个值必须是一个结构,给出该类或接口中字段的完整描述。该表只包含由这个类或接口声明的字段。它不包括表示从超类或超接口继承的字段的项。

  12. methods_count:该项的值给出了表中结构体的数量。

  13. methods[]:

    1. 每个表中的值必须是一个结构,给出了该类或接口中一个方法的完整描述。这个结构包括方法的访问标志(access_flags)、方法名称、描述符等信息。如果结构中的 flags 中没有设置 ACC_NATIVE 或 ACC_ABSTRACT 标志,那么还会提供实现该方法的 Java 虚拟机指令。

    2. 这些结构代表了该类或接口类型声明的所有方法,包括实例方法、类方法、实例初始化方法以及任何类或接口初始化方法。表中不包括代表从超类或超接口继承的方法的条目。

    3. method_info 结构包含了关于方法的详细信息,如方法的修饰符、名称、描述符等。每个 method_info 结构表示一个方法。

  14. attributes_count:该项的值给出了该类表中的属性数。

  15. attributes[]:

    1. 表的每个值必须是一个结构(§4.7)。attributesattribute_info

    2. 表4.7-C中列出了本规范定义的在结构表中出现的属性。attributesClassFile

    3. 关于定义在结构表中出现的属性的规则在§4.7中给出。attributesClassFile

    4. 关于结构表中非预定义属性的规则在§4.7.1中给出。attributesClassFile
       

你可能感兴趣的:(JVM,jvm)