詳解虛擬機識別的Class類文件結構信息

一、魔數

每個class的頭4個字節叫做魔數,用來表示這個文件是不是能被虛擬機所識別的文件。這個值就是cafebabe(咖啡寶貝)。

二、版本號

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;
    }
}

其中常量池部分如下:

四、訪問標誌

訪問標誌是用來識別類或者接口的訪問權限,例如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 標識這是一個模塊

五、字段表集合

用於描述接口或者類中聲明的變量;其中對於描述符來描述方法時,按照先參數列表、後返回值的順序描述。()I表示,參數爲空,返回類型爲int。

標識字符 含義
B 基本類型byte
C 基本類型char
D 基本類型double
F 基本類型float
I 基本類型int
J 基本類型long
S 基本類型short
Z 基本類型boolean
V 特殊類型void
L 對象類型,如Ljava/lang/Object

六、屬性表集合

用來描述某些場景專有的信息。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章