Class 文件方法表之後為屬性表(attributes_count + attributes[]),屬性可出現於 ClassFile、field_info、method_info、Code 屬性等多個層級。本文系統講解 5 個核心屬性的結構、編碼規則與實際反編譯驗證。

attribute_name_index (u2):指向常量池 CONSTANT_Utf8_info(屬性名)attribute_length (u4):屬性數據長度(不含前 6 字節)info[]:具體屬性數據,長度由 attribute_length 決定
sourcefile_index (u2):指向常量池 Utf8(源文件名,不含路徑)attribute_length = 2反編譯驗證:
SourceFile: "Person.java" Constant pool: #20 = Utf8 SourceFile #21 = Utf8 Person.java


number_of_classes (u2):內部類數量classes[]:每項為 inner_class_info(4 個 u2 索引)inner_class_info 結構:

inner_class_info_index:內部類 Class 索引outer_class_info_index:外部類 Class 索引(0 表示無)inner_name_index:內部類簡單名(Utf8,匿名類為 0)inner_class_access_flags:內部類訪問標志雙向約束:外部類必須列舉所有內部類;內部類必須指向外部類。多層嵌套遞歸記錄。

attribute_length = 0),純標志位典型場景:
<init><clinit> 方法注意:屬性可選,某些編譯器版本可能不生成。

field_info(字段屬性表)constantvalue_index (u2):指向常量池字面量項常量池項類型映射:
| 字段類型 | 常量池項類型 |
|---|---|
| byte/short/char/boolean/int | CONSTANT_Integer_info |
| long | CONSTANT_Long_info |
| float | CONSTANT_Float_info |
| double | CONSTANT_Double_info |
| String | CONSTANT_String_info |
JVM 執行語義:若使用 ConstantValue,賦值動作發生在 <clinit> 執行之前(類加載準備階段)。
反編譯驗證:
static final int a = 1; Constant pool: #7 = Utf8 ConstantValue #8 = Integer 1 ConstantValue: int 1


attribute_length = 0,純標志@Deprecated 註解反編譯驗證:
@Deprecated int getAge() { ... }
Constant pool:
#18 = Utf8 Deprecated
flags: Deprecated: true

屬性表採用統一自描述格式(名稱索引+長度+數據),支援層級化出現(Class/字段/方法/Code),實現了元數據的靈活擴展。掌握核心屬性結構,是構建字節碼分析工具、理解編譯器行為、診斷類加載異常的關鍵基礎。