無符號數屬於基礎資料型別 (Elementary Data Type),以u1、u2、u4、u8來分別代表1、2、4、8個位元組的無符號數。表是由多個無符號數或其他表作為資料項目構成的符合資料類型,所有的表都習慣性地以“_info”結尾。
(),它的唯一作用是判斷該檔案是否為一個能被虛擬機器接受的Class檔案。它的值固定為0xCAFEBABE。緊接著magic的4個位元組儲存的是Class檔案的次版本號碼和主要版本號,高版本的JDK能向下相容低版本的Class檔案,但不能運行更高版本的Class檔案。
()的入口,它是Class檔案中與其他項目關聯最多的資料類型,也是佔用Class檔案空間最大的資料項目之一。
字面量比較接近於Java層面的常量概念,如文本字串、被聲明為final的常量值等。而符號引用總結起來則包括了下面三類常量:
- :符號引用以一組符號來描述所引用的目標,符號可以是任何形式的字面量,只要使用時能無歧義地定位到目標即可。符號引用與虛擬機器實現的記憶體布局無關,引用的目標並不一定已經載入到了記憶體中。
- :直接引用可以是直接指向目標的指標、相對位移量或是一個能間接定位到目標的控制代碼。直接引用是與虛擬機器實現的記憶體布局相關的,同一個符號引用在不同虛擬機器執行個體上翻譯出來的直接引用一般不會相同。如果有了直接引用,那說明引用的目標必定已經存在於記憶體之中了。
|
|
|
|
CONSTANT_Utf8_info |
|
|
值為 |
length |
u2 |
UF-8 |
bytes |
u1 |
長度為 |
CONSTANT_Integer_info |
tag |
u1 |
值為 |
bytes |
u4 |
按照高位在前儲存的 |
CONSTANT_Float_info |
tag |
u1 |
值為 |
bytes |
u4 |
按照高位在前儲存的 |
CONSTANT_Long_info |
tag |
u1 |
值為 |
bytes |
u8 |
按照高位在前儲存的 |
CONSTANT_Double_info |
tag |
u1 |
值為 |
bytes |
u8 |
按照高位在前儲存的 |
CONSTANT_Class_info |
tag |
u1 |
值為 |
index |
u2 |
指向全限定名常量項的索引 |
CONSTANT_String_info |
tag |
u1 |
值為 |
index |
u2 |
指向字串字面量的索引 |
CONSTANT_Fieldref_info |
tag |
u1 |
值為 |
index |
u2 |
指向聲明欄位的類或介面描述符 |
index |
u2 |
指向欄位名稱及類型描述元 |
CONSTANT_Methodref_info |
tag |
u1 |
值為 |
index |
u2 |
指向聲明方法的類描述符 |
index |
u2 |
指向方法名稱及類型描述元 |
CONSTANT_InrerfaceMethodref_info |
tag |
u1 |
值為 |
index |
u2 |
指向聲明方法的介面描述符 |
index |
u2 |
指向方法名稱及類型描述元 |
CONSTANT_NameAndType_info |
tag |
u1 |
值為 |
index |
u2 |
指向欄位或方法名稱常量項目的索引 |
index |
u2 |
指向該欄位或方法描述符常量項的索引 |
在常量池結束之後,緊接著的2個位元組代表訪問標誌(access_flag),這個標誌用於識別一些類或介面層次的訪問資訊,包括:這個Class是類還是介面,是否定義為public類型,abstract類型,如果是類的話,是否聲明為final,等等。每種訪問資訊都由一個十六進位的標誌值表示,如果同時具有多種訪問資訊,則得到的標誌值為這幾種訪問資訊的標誌值的邏輯或。
this_class、super_class、interfaces
下面是欄位表的最種格式:
int m = 2;那就可能會存在一項名為ConstantValue的屬性,它指向常量2。關於attribute_info的詳細內容,在後面關於屬性工作表的項目中會有詳細介紹。
比如在內部類中為了保持對外部類的訪問性,會自動添加指向外部類執行個體的欄位。
如果方法表有Code屬性存在,那麼它的結構將如下表所示:
)出現了類型為catch_type或其子類的異常(catch_type為指向一個CONSTANT_Class_info型常量的索引這篇文章中出現的情況。
),如果該變數沒有被final修飾,或者並非基本類型及字串,則選擇在<clinit>方法中進行初始化。
而且ConstantValue的屬性值只限於基本類型和String,很明顯這是因為它從常量池中也只能夠引用到基本類型和String類型的字面量。
下面簡要說明下final、static、 final修飾的欄位賦值的區別: