class位元組碼文件結構 | 類型 | 名稱 | 說明 | 長度 | 數量 | | | | | | | | u4 | magic | 魔數,識別Class文件格式 | 4個位元組 | 1 | | u2 | minor_version | 副版本號(小版本) | 2個位元組 | 1 | | u2 | ma ...
class位元組碼文件結構
類型 | 名稱 | 說明 | 長度 | 數量 |
---|---|---|---|---|
u4 | magic | 魔數,識別Class文件格式 | 4個位元組 | 1 |
u2 | minor_version | 副版本號(小版本) | 2個位元組 | 1 |
u2 | major_version | 主版本號(大版本) | 2個位元組 | 1 |
u2 | constant_pool_count | 常量池計數器 | 2個位元組 | 1 |
cp_info | constant_pool | 常量池表 | n個位元組 | constant_pool_count-1 |
u2 | access_flags | 訪問標識 | 2個位元組 | 1 |
u2 | this_class | 類索引 | 2個位元組 | 1 |
u2 | super_class | 父類索引 | 2個位元組 | 1 |
u2 | interfaces_count | 介面計數器 | 2個位元組 | 1 |
u2 | interfaces | 介面索引集合 | 2個位元組 | interfaces_count |
u2 | fields_count | 欄位計數器 | 2個位元組 | 1 |
field_info | fields | 欄位表 | n個位元組 | fields_count |
u2 | methods_count | 方法計數器 | 2個位元組 | 1 |
method_info | methods | 方法表 | n個位元組 | methods_count |
u2 | attributes_count | 屬性計數器 | 2個位元組 | 1 |
attribute_info | attributes | 屬性表 | n個位元組 | attributes_count |
Class文件版本號和平臺的對應
主版本(十進位) | 副版本(十進位) | 編譯器版本 |
---|---|---|
45 | 3 | 1.1 |
46 | 0 | 1.2 |
47 | 0 | 1.3 |
48 | 0 | 1.4 |
49 | 0 | 1.5 |
50 | 0 | 1.6 |
51 | 0 | 1.7 |
52 | 0 | 1.8 |
53 | 0 | 1.9 |
54 | 0 | 1.10 |
55 | 0 | 1.11 |
class文件數據類型
數據類型 | 定義 | 說明 |
---|---|---|
無符號數 | 無符號數可以用來描述數字、索引引用、數量值或按照utf-8編碼構成的字元串值。 | 其中無符號數屬於基本的數據類型。 以u1、u2、u4、u8來分別代表1個位元組、2個位元組、4個位元組和8個位元組 |
表 | 表是由多個無符號數或其他表構成的複合數據結構。 | 所有的表都以“_info”結尾。 由於表沒有固定長度,所以通常會在其前面加上個數說明。 |
類型描述符
標誌符 | 含義 |
---|---|
B | 基本數據類型byte |
C | 基本數據類型char |
D | 基本數據類型double |
F | 基本數據類型float |
I | 基本數據類型int |
J | 基本數據類型long |
S | 基本數據類型short |
Z | 基本數據類型boolean |
V | 代表void類型 |
L | 對象類型,比如:Ljava/lang/Object; |
[ | 數組類型,代表一維數組。比如:double[][][] is [[[D |
常量類型和結構
類型 | 標誌(或標識) | 描述 |
---|---|---|
CONSTANT_utf8_info | 1 | UTF-8編碼的字元串 |
CONSTANT_Integer_info | 3 | 整型字面量 |
CONSTANT_Float_info | 4 | 浮點型字面量 |
CONSTANT_Long_info | 5 | 長整型字面量 |
CONSTANT_Double_info | 6 | 雙精度浮點型字面量 |
CONSTANT_Class_info | 7 | 類或介面的符號引用 |
CONSTANT_String_info | 8 | 字元串類型字面量 |
CONSTANT_Fieldref_info | 9 | 欄位的符號引用 |
CONSTANT_Methodref_info | 10 | 類中方法的符號引用 |
CONSTANT_InterfaceMethodref_info | 11 | 介面中方法的符號引用 |
CONSTANT_NameAndType_info | 12 | 欄位或方法的符號引用 |
CONSTANT_MethodHandle_info | 15 | 表示方法句柄 |
CONSTANT_MethodType_info | 16 | 標誌方法類型 |
CONSTANT_InvokeDynamic_info | 18 | 表示一個動態方法調用點 |
常量類型和結構細節
訪問標誌
標誌名稱 | 標誌值 | 含義 |
---|---|---|
ACC_PUBLIC | 0x0001 | 標誌為public類型 |
ACC_FINAL | 0x0010 | 標誌被聲明為final,只有類可以設置 |
ACC_SUPER | 0x0020 | 標誌允許使用invokespecial位元組碼指令的新語義,JDK1.0.2之後編譯出來的類的這個標誌預設為真。(使用增強的方法調用父類方法) |
ACC_INTERFACE | 0x0200 | 標誌這是一個介面 |
ACC_ABSTRACT | 0x0400 | 是否為abstract類型,對於介面或者抽象類來說,次標誌值為真,其他類型為假 |
ACC_SYNTHETIC | 0x1000 | 標誌此類並非由用戶代碼產生(即:由編譯器產生的類,沒有源碼對應) |
ACC_ANNOTATION | 0x2000 | 標誌這是一個註解 |
ACC_ENUM | 0x4000 | 標誌這是一個枚舉 |
欄位表訪問標誌
標誌名稱 | 標誌值 | 含義 |
---|---|---|
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_TRANSTENT | 0x0080 | 欄位是否為transient |
ACC_SYNCHETIC | 0x1000 | 欄位是否為由編譯器自動產生 |
ACC_ENUM | 0x4000 | 欄位是否為enum |
類索引、父類索引、介面索引
長度 | 含義 |
---|---|
u2 | this_class |
u2 | super_class |
u2 | interfaces_count |
u2 | interfaces[interfaces_count] |
屬性的通用格式
類型 | 名稱 | 數量 | 含義 |
---|---|---|---|
u2 | attribute_name_index | 1 | 屬性名索引 |
u4 | attribute_length | 1 | 屬性長度 |
u1 | info | attribute_length | 屬性表 |
數據類型和預設初始值對應
類型 | 預設初始值 |
---|---|
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0 |
char | \u0000 |
boolean | false |
reference | null |