一、魔數
每個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 |
六、屬性表集合
用來描述某些場景專有的信息。