型別
名稱
數量
u2
fields_count
1
u2
fields
fields_count
欄位表
:
用於描述介面或類中宣告的變數,包括類級變數或例項變數,不包區域性變數。修飾字段作用域(public,private,protected等)是例項變數還是類變數(static)可變性(final)併發可見性(volatile 是否強制從記憶體讀取)。
欄位表的具體結構如下:
型別
名稱
數量
型別
名稱
數量
u2
access_flags
1
u2
attributes_count
1
u2
name_index
1
attribute_info
attributes
attributes_count
u2
descriptor_index
1
欄位修飾符放在
access_flags 專案中,與類中 access_flags 專案非常類似如下:
標誌名稱
標誌值
含義
標誌名稱
標誌值
含義
ACC_PUBLIC
0x0001
欄位是否public
ACC_VOLATILE
0x0040
欄位是否volatile
ACC_PRIVATE
0x0002
欄位是否private
ACC_TRANSIENT
0x0080
欄位是否transient
ACC_PROTECTED
0x0004
欄位是否protected
ACC_SYNTHETIC
0x1000
欄位是否由編譯器自動產生
ACC_STATIC
0x0008
欄位是否static
ACC_ENUM
0x4000
欄位是否enum
ACC_FINAL
0x0010
欄位是否final
ACC_PUBLIC,ACC_PROTECTED,ACC_PRIVATE 只能選其一,介面欄位必須有ACC_PUBIIC,ACC_STATIC,ACC_FINAL標誌,這些都是語言規則所導致的。
全限定名
:如“com/bzy/demo” 是這個類的全限定名,緊把類中。替換/而已,為多個全限定名混淆中間加; 符號。
簡單名稱
:沒有型別或 引數修飾符的方法或者欄位名稱。
描述符
:描述欄位資料型別,方法引數列表(數量,型別,及順序)返回值。
標識字元
含義
標識字元
含義
B
基本型別 byte
L
基本型別 long
C
基本型別 char
S
基本型別 short
D
基本型別 double
Z
基本型別 boolean
F
基本型別 float
I
基本型別 int
L
物件型別,如java/lang/Object
陣列型別
:
每維度用一個前置[ 符號,如 java。lang。String[][] 二維陣列將被記成 “[[Ljava/lang/String;” 整型int[] 記成“[I”,用描述符來描述方法時,按先引數列表,後返回值的順序描述,引數列表按引數順序放在一組小括號()內。如方法 void inc() 描述符“()V” 方法java。lang。String。toString() 描述為 “()Ljava/lang/String”,一個整型陣列“int[]”被記錄成“[i”。
用描述符來描述方法時,按照
先引數列表,後返回值的順序描述,
引數列表按照引數嚴格順序放在一組小括號()內,如方法void inc()的描述符為“()v”,方法java。lang。String。toString()描述符為“()java/lang/String”。