Class 文件常量池之後的數據區域,定義了類的核心身份信息:訪問修飾符、本類索引、父類索引、實現接口集合。本文系統梳理這些關鍵數據項的結構、取值規則與實際編碼邏輯。
佔 2 字節,採用位掩碼方式組合:
| 標志名 | 值 | 含義 | 適用對象 |
|---|---|---|---|
| ACC_PUBLIC | 0x0001 | public 類型 | 類、接口、枚舉、注解 |
| ACC_FINAL | 0x0010 | final 類型 | 類 |
| ACC_SUPER | 0x0020 | 使用新 invokespecial 語義 | 類、接口 |
| ACC_INTERFACE | 0x0200 | 接口類型 | 接口 |
| ACC_ABSTRACT | 0x0400 | abstract 類型 | 類、接口 |
| ACC_SYNTHETIC | 0x1000 | 非用戶代碼生成(編譯器產物) | 類、字段、方法 |
| ACC_ANNOTATION | 0x2000 | 注解類型 | 注解 |
| ACC_ENUM | 0x4000 | 枚舉類型 | 枚舉 |
許多開發者困惑:super 是關鍵字而非修飾符,為何存在 ACC_SUPER?
invokespecial:用於調用構造器、私有方法、父類方法invokespecial 採靜態綁定ACC_SUPER:賦予 invokespecial 動態綁定能力,正確支援 super.method() 語義javac 默認開啟)ACC_ANNOTATION (0x2000):標識 @interface 定義的注解類型ACC_ENUM (0x4000):標識 enum 定義的枚舉類型CONSTANT_Class_info 索引CONSTANT_Class_info 的 name_index 指向 CONSTANT_Utf8_info,存儲完全限定名(如 com/bjpowernode/test/Person)
CONSTANT_Class_infoCONSTANT_Class_info
interfaces_count:直接實現/繼承的接口數量(不含父類鏈接口)interfaces[]:索引數組,每項指向 CONSTANT_Class_info → CONSTANT_Utf8_info(接口完全限定名)
Class 級 access_flags 僅描述類/接口/枚舉/注解本身的修飾符,不包含 字段、方法的修飾符。字段與方法各自在 field_info、method_info 中擁有獨立的 access_flags。
這四個數據項(this_class、super_class、interfaces_count、interfaces)構成了類的「身份證」與「族譜」,全部通過常量池索引間接引用字符串常量,體現了 Class 文件「常量池為中心」的設計哲學。掌握其編碼規則,是實現類文件解析器、字節碼操作工具、動態代理框架的基礎。