详解虚拟机识别的Class类文件结构信息

一、魔数

每个class的头4个字节叫做魔数,用来表示这个文件是不是能被虚拟机所识别的文件。这个值就是cafebabe(咖啡宝贝)。

详解虚拟机识别的Class类文件结构信息_第1张图片

二、版本号

class文件中,第5和第6个字节表示的是java的此版本好,第7和第8个字节是主版本号,上图中0034表示的是10进制的52,也就是java8的版本。依次类推,JDK7表示51,JDK6表示50。

三、常量池

常量池可以作为class文件中的资源仓库。其中常量池中主要存放字面量(Literal)和符号引用(Systembolic References)。

字面量:可以理解为我们在代码中定义的值:如字符串的值,被声明为final的常量值。

符号引用:主要包括被模块导出或者开放的包;类和接口的全限定名;字段的名称和描述符;方法的名称和描述符;方法句柄和方法类型;动态调用点和动态常量。

以下面这段代码为例:我们可以使用javap -verbose来查看代码中的全部常量池信息:

示例代码:

public class TestClass {

    private int m;

    public int inc() {
        return m + 1;
    }
}

其中常量池部分如下:

详解虚拟机识别的Class类文件结构信息_第2张图片

四、访问标志

访问标志是用来识别类或者接口的访问权限,例如public,final,abstract等字段。

标志名称 标志值 含义
ACC_PUBLIC 0x0001 是否为public类型
ACC_FINAL 0x0010 是否被声明final,只有类可设置
ACC_SUPER 0x0020 是否允许使用invokespecial。
ACC_INTERFACE 0x0200 标识这是一个接口
ACC_ABSTRACT 0x0400 是否为abstract类型,对于接口或者抽象类来说,此标志值为真,其他类型值为假
ACC_SYNTHETIC 0x1000 标识这个类并非由用户代码产生的
ACC_ANNOTATION 0x2000 标识这是一个注解
ACC_ENUM 0x4000 标识这是一个枚举
ACC_MODULE 0x8000 标识这是一个模块

详解虚拟机识别的Class类文件结构信息_第3张图片

五、字段表集合

用于描述接口或者类中声明的变量;其中对于描述符来描述方法时,按照先参数列表、后返回值的顺序描述。()I表示,参数为空,返回类型为int。

标识字符 含义
B 基本类型byte
C 基本类型char
D 基本类型double
F 基本类型float
I 基本类型int
J 基本类型long
S 基本类型short
Z 基本类型boolean
V 特殊类型void
L 对象类型,如Ljava/lang/Object

详解虚拟机识别的Class类文件结构信息_第4张图片

六、属性表集合

用来描述某些场景专有的信息。

详解虚拟机识别的Class类文件结构信息_第5张图片

 

你可能感兴趣的:(java)