

2、class檔案的內容
class檔案“基本型別”
類 型 | 描 述 |
u1 | 1個位元組,無符號型別 |
u2 | 2個位元組,無符號型別 |
u4 | 4個位元組,無符號型別 |
u8 | 8個位元組,無符號型別 |
ClassFile表的格式
類 型 | 名 稱 | 數 量 |
u4 | magic | 1 |
u2 | minor_version | 1 |
u2 | major_version | 1 |
u2 | constant_pool_count | 1 |
cp_info | constant_pool | constant_pool_count-1 |
u2 | access_flags | 1 |
u2 | this_class | 1 |
u2 | super_class | 1 |
u2 | interfaces_count | 1 |
u2 | interfaces | interfaces_count |
u2 | fields_count | 1 |
field_info | fields | fields_count |
u2 | methods_count | 1 |
method_info | methods | methods_count |
u2 | attributes_count | 1 |
attribute_info | attributes | attributes_count |
Class檔案組織結果:


常量池標誌
入 口 類 型 | 標 志 值 | 描 述 |
CONSTANT_Utf8 | 1 | UTF-8編碼的Unicode字串 |
CONSTANT_Integer | 3 | int型別字面值 |
CONSTANT_Float | 4 | float型別字面值 |
CONSTANT_Long | 5 | long型別字面值 |
CONSTANT_Double | 6 | double型別字面值 |
CONSTANT_Class | 7 | 對一個類或介面的符號引用 |
CONSTANT_String | 8 | String型別字面值 |
CONSTANT_Fieldref | 9 | 對一個欄位的符號引用 |
CONSTANT_Methodref | 10 | 對一個類中宣告的方法的符號引用 |
CONSTANT_InterfaceMethodref | 11 | 對一個介面中宣告的方法的符號引用 |
CONSTANT_NameAndType | 12 | 對一個欄位或方法的部分符號引用 |
- 類和介面的全限定名
- 欄位的名稱和描述符
- 方法的名稱和描述符
access_flags項的標誌位
標 志 名 | 值 | 設定後的含義 | 設 置 者 |
ACC_PUBLIC | 0x0001 | public型別 | 類和介面 |
ACC_FINAL | 0x0010 | 類為final型別 | 只有類 |
ACC_SUPER | 0x0020 | 使用新型的invokespecial語義 | 類和介面 |
ACC_INTERFACE | 0x0200 | 介面型別,不是類型別 | 所有的介面,沒有類 |
ACC_ABSTRACT | 0x0400 | abstract型別 | 所有的介面,部分類 |

- 特殊字串
- 全限定名
- 簡單名稱
- 描述符
基本型別終結符
終 結 符 | 類 型 |
B | byte |
C | char |
D | double |
F | float |
I | int |
J | long |
S | short |
Z | boolean |
欄位描述符示例
描 述 符 | 字 段 聲 明 |
I | int i; |
[[J | long[][] windingRoad; |
[Ljava/lang/Object; | java.lang.Object[] stuff; |
Ljava/util/Hashtable; | java.util.Hashtable ht; |
[[[Z | boolean[][][] isReady; |
方法描述符示例
描 述 符 | 方 法 聲 明 |
()I | int getSize(); |
()Ljava/lang/String; | String toString(); |
([Ljava/lang/String;)V | void main(String[] args); |
()V | void wait(); |
(JI)V | void wait(long timeout, int nanos); |
(ZILjava/lang/String;II)Z | boolean regionMatches(boolean ignoreCase, int toOffset, String other, int offset, int len); |
([BII)I | int read(byte[] b, int off, int len); |
cp_info表的通常形式
類 型 | 名 稱 | 數 量 | 描 述 |
u1 | tag | 1 | 表的型別和格式 |
u1 | info | 根據tag值決定 |
CONSTANT_Utf8_info表的格式
類 型 | 名 稱 | 數 量 | 描 述 |
u1 | tag | 1 | 值為CONSTANT_Utf8(1) |
u2 | length | 1 | bytes項的長度(位元組數) |
u1 | bytes | length | 按照變體UTF-8格式儲存的字串中的字元 |
CONSTANT_Integer_info表的格式
類 型 | 名 稱 | 數 量 | 描 述 |
u1 | tag | 1 | 值為CONSTANT_Integer(3) |
u4 | bytes | 1 | 按照高位在前的格式儲存int型別值 |
CONSTANT_Float_info表的格式
類 型 | 名 稱 | 數 量 | 描 述 |
u1 | tag | 1 | 值為CONSTANT_Float(4) |
u4 | bytes | 1 | 按照高位在前的格式儲存float型別值 |
CONSTANT_Long_info表的格式
類 型 | 名 稱 | 數 量 | 描 述 |
u1 | tag | 1 | 值為CONSTANT_Long(5) |
u8 | bytes | 1 | 按照高位在前的格式儲存long型別值 |
CONSTANT_Double_info表的格式
類 型 | 名 稱 | 數 量 | 描 述 |
u1 | tag | 1 | 值為CONSTANT_Double(6) |
u8 | bytes | 1 | 按照高位在前的格式儲存double型別值 |
CONSTANT_Class_info表的格式
類 型 | 名 稱 | 數 量 | 描 述 |
u1 | tag | 1 | 值為CONSTANT_Class(7) |
u2 | name_index | 1 | 包含類或者介面全限定名的CONSTANT_Utf8_info表的索引 |
CONSTANT_String_info表的格式
類 型 | 名 稱 | 數 量 | 描 述 |
u1 | tag | 1 | 值為CONSTANT_String(8) |
u2 | string_index | 1 | 包含文字字串值的CONSTANT_Utf8_info表的索引 |
CONSTANT_Fieldref_info表的格式
類 型 | 名 稱 | 數 量 | 描 述 |
u1 | tag | 1 | 值為CONSTANT_Fieldref(9) |
u2 | class_index | 1 | 宣告被引用欄位的類或者介面的CONSTANT_Class_info入口的索引 |
u2 | name_and_type_index | 1 | 提供了CONSTANT_NameAndType_info入口的索引,該入口提供了欄位的簡單名稱以及描述符 |
CONSTANT_Methodref_info表的格式
類 型 | 名 稱 | 數 量 | 描 述 |
u1 | tag | 1 | 值為CONSTANT_Methodref(10) |
u2 | class_index | 1 | 宣告被引用方法的類的CONSTANT_Class_info入口的索引 |
u2 | name_and_type_index | 1 | 提供了CONSTANT_NameAndType_info入口的索引,該入口提供了方法的簡單名稱以及描述符 |
CONSTANT_InterfaceMethodref_info表的格式
類 型 | 名 稱 | 數 量 | 描 述 |
u1 | tag | 1 | 值為CONSTANT_InterfaceMethodref(11) |
u2 | class_index | 1 | 宣告被引用方法的介面的CONSTANT_Class_info入口的索引 |
u2 | name_and_type_index | 1 | 提供了CONSTANT_NameAndType_info入口的索引,該入口提供了方法的簡單名稱以及描述符 |
CONSTANT_NameAndType_info表的格式
類 型 | 名 稱 | 數 量 | 描 述 |
u1 | tag | 1 | 值為CONSTANT_NameAndType(12) |
u2 | name_index | 1 | 給出了CONSTANT_Utf8_info入口的索引,該入口給出了欄位或者方法的名稱 |
u2 | descriptor_index | 1 | 提供了CONSTANT_Utf8_info入口的索引,該入口提供了欄位或者方法的描述符 |
field_info表的格式
類 型 | 名 稱 | 數 量 | 描 述 |
u2 | access_flags | 1 | 見下方的表 |
u2 | name_index | 1 | 提供了給出欄位簡單名稱(不是全限定名)的CONSTANT_Utf8_info入口的索引 |
u2 | descriptor_index | 1 | 提供了給出欄位描述符的CONSTANT_Utf8_info入口的索引 |
u2 | atrributes_count | 1 | attributes_count指出列表中attribute_info表的數量 |
attribute_info | atrributes | atrributes_count | 由多個attribute_info表組成的列表 |
field_info表中access_flags項的標誌
標 志 名 稱 | 值 | 設 定 含 義 | 設 定 者 |
ACC_PUBLIC | 0x0001 | 欄位設為public | 類和介面 |
ACC_PRIVATE | 0x0002 | 欄位設為private | 只有類 |
ACC_PROTECTED | 0x0004 | 欄位設為protected | 只有類 |
ACC_STATIC | 0x0008 | 欄位設為static | 類和介面 |
ACC_FINAL | 0x0010 | 欄位設為final | 類和介面 |
ACC_VOLATILE | 0x0040 | 欄位設為volatile | 只有類 |
ACC_TRANSIENT | 0x0080 | 欄位設為transient | 只有類 |
method_info表的格式
類 型 | 名 稱 | 數 量 | 描 述 |
u2 | access_flags | 1 | 見下方的表 |
u2 | name_index | 1 | 提供了給出方法簡單名稱(不是全限定名)的CONSTANT_Utf8_info入口的索引 |
u2 | descriptor_index | 1 | 提供了給出方法描述符的CONSTANT_Utf8_info入口的索引 |
u2 | atrributes_count | 1 | attributes_count指出列表中attribute_info表的數量 |
attribute_info | atrributes | atrributes_count | 由多個attribute_info表組成的列表 |
method_info表中access_flags項的標誌
標 志 名 稱 | 值 | 設 定 含 義 | 設 定 者 |
ACC_PUBLIC | 0x0001 | 方法設為public | 類和所有的介面方法 |
ACC_PRIVATE | 0x0002 | 方法設為private | 只有類 |
ACC_PROTECTED | 0x0004 | 方法設為protected | 只有類 |
ACC_STATIC | 0x0008 | 方法設為static | 只有類 |
ACC_FINAL | 0x0010 | 方法設為final | 只有類 |
ACC_SYNCHRONIZED | 0x0020 | 方法設為synchronized | 只有類 |
ACC_NATIVE | 0x0100 | 方法設為native | 只有類 |
ACC_ABSTRACT | 0x0400 | 方法設為abstract | 類和所有的介面方法 |
ACC_STRICT | 0x0800 | 方法設為strictFP | 類和介面的<clinit>方法 |
由規範定義的attribute_info表的型別
名 稱 | 使 用 者 | 描 述 |
Code | method_info | 方法的位元組碼和其他資料 |
ConstantValue | field_info | final變數的值 |
Deprecated | field_info、method_info | 欄位或者方法被禁用的指示符 |
Exceptions | method_info | 方法可能丟擲的可被檢測的異常 |
InnerClasses | ClassFile | 內部、外部類的列表 |
LineNumberTable | Code_attribute | 方法的行號與位元組碼的對映 |
LocalVariableTable | Code_attribute | 方法的區域性變數的描述 |
SourceFile | ClassFile | 原始檔名 |
Synthetic | field_info、method_info | 編譯器產生的欄位或者方法的指示符 |
載入和儲存指令用於將資料從棧幀的區域性變數表和運算元棧之間來回傳輸:
訪問物件的欄位或陣列元素的指令也同樣會與運算元棧傳輸資料。
上面所列舉的指令助記符中,有一部分是以尖括號結尾的(例如 iload_<n>),這些指令助記符實際上是代表了一組指令(例如 iload_<n>,它代表了 iload_0、iload_1、iload_2 和 iload_3 這幾條指令)。這幾組指令都是某個帶有一個運算元的通用指令(例如
iload)的特殊形式,對於這若干組特殊指令來說,它們表面上沒有運算元,不需要進行取運算元的動作,但運算元都是在指令中隱含的。除此之外,他們的語義與原生的通用指令完全一致(例如 iload_0 的語義與運算元為 0 時的 iload 指令語義完全一致)。在尖括號之間的字母制定了指令隱含運算元的資料型別,<i>代表是 int 形資料,<l>代表 long 型,<f>代表 float 型,<d>代表 double型。在操作 byte、char 和 short 型別資料時,也用 int 型別表示。
這種指令表示方法,在整個《Java 虛擬機器規範》之中都是通用的。
算術指令用於對兩個運算元棧上的值進行某種特定運算,並把結果重新存入到操作棧頂。大體上運算指令可以分為兩種:對整型資料進行運算的指令與對浮點型資料進行運算的指令,無論是那種算術指令,都是使用 Java 虛擬機器的數字型別的。資料沒有直接支援
byte、short、char 和 boolean 型別的算術指令,對於這些資料的運算,都是使用操作 int 型別的指令。
整數與浮點數的算術指令在溢位和被零除的時候也有各自不同的行為,所有的算術指令包括:
和 d2f。窄化型別轉換可能會導致轉換結果產生不同的正負號、不同的數量級,轉換過程很可能會導致數值丟失精度。
雖然類例項和陣列都是物件,但 Java 虛擬機器對類例項和陣列的建立與操作使用了不同的位元組碼指令:
Java 虛擬機器提供了一些用於直接操作運算元棧的指令,包括:pop、pop2、dup、dup2、dup_x1、dup2_x1、dup_x2、dup2_x2 和 swap。
控制轉移指令可以讓 Java 虛擬機器有條件或無條件地從指定指令而不是控制轉移指令的下一條指令繼續執行程式。控制轉移指令包括有:
以下四條指令用於方法呼叫:
而方法返回指令則是根據返回值的型別區分的,包括有 ireturn(當返回值是 boolean、byte、char、short 和 int 型別時使用)、lreturn、freturn、dreturn 和 areturn,另外還有一條 return
指令供宣告為 void 的方法、例項初始化方法、類和介面的類初始化方法使用。
在程式中顯式丟擲異常的操作會由 athrow 指令實現,除了這種情況,還有別的異常會在其它 Java 虛擬機器指令檢測到異常狀況時由虛擬機器自動丟擲。
9、同步指令
兩條指令來支援 synchronized 關鍵字的語義,正確實現 synchronized 關鍵字需要編譯器與 Java 虛擬機器兩者協作支援。
写评论
很抱歉,必須登入網站才能發佈留言。