Class 文件作為 JVM 執行的基礎單元,其結構嚴謹且層次分明。繼魔數、版本號、常量池、訪問標志、類/父類/接口索引之後,緊接著的是字段表集合。本文將詳細拆解字段表的結構、訪問標志、描述符及實際解析案例。
字段表用於描述類或接口中聲明的變量,包括類變量與實例變量,不包含方法內部的局部變量。緊接在接口索引集合之後,由多個 field_info 結構組成。
| 類型 | 名稱 | 數量 |
|---|---|---|
| u2 | access_flags | 1 |
| u2 | name_index | 1 |
| u2 | descriptor_index | 1 |
| u2 | attributes_count | 1 |
| attribute_info | attributes | attributes_count |
access_flags 為 u2 類型,各標志位含義如下:
| 標志名稱 | 標志值 | 含義 |
|---|---|---|
| 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 |
| ACC_SYNTHETIC | 0x1000 | 編譯器自動生成 |
| ACC_ENUM | 0x4000 | enum |
name_index 和 descriptor_index 均為常量池索引,分別指向字段簡單名稱與描述符。描述符用於表示數據類型:
| 標志符 | 含義 |
|---|---|
| B | byte |
| C | char |
| D | double |
| F | float |
| I | int |
| J | long |
| S | short |
| Z | boolean |
| V | void |
| L | 對象類型(如 Ljava/lang/String;) |
數組類型每維度前綴 [,如 [[Ljava/lang/String; 表示二維字符串數組。
某 Class 文件字段表區域十六進制片段:
0x00 01 // fields_count = 1 0x00 02 // access_flags = ACC_PRIVATE 0x00 05 // name_index = #5 → 常量池第5項 "m" 0x00 06 // descriptor_index = #6 → 常量池第6項 "I" (int) 0x00 00 // attributes_count = 0
對應源碼:private int m; 解析完全吻合。


