Class 文件是什麼?
- 一個 Java 類或介面的全面二進制描述
- JVM 執行引擎的標準輸入格式(中間語言)
- 單一文件只能包含一個類或介面
- 不綁定 Java 語言,Kotlin、Scala、Groovy 等編譯產物同為 Class 文件
Class 文件核心數據項
Class 文件採用類似 C 結構體的緊湊格式,無任何分隔符,按順序包含:
- 魔數與版本:
0xCAFEBABE 標識 + 主/次版本號
- 常量池:字面量、符號引用的「資源倉庫」,是文件中最佔空間、結構最複雜的部分
- 訪問標誌:識別類/介面、public、abstract、final 等修飾符
- 類索引、父類索引、介面索引集合:確定繼承關係
- 字段表集合:描述成員變數(含修飾符、類型、名稱)
- 方法表集合:描述方法(含修飾符、參數、返回值、異常表、字節碼指令)
- 屬性表集合:Code 屬性(字節碼)、LineNumberTable、LocalVariableTable、SourceFile、Deprecated、Signature、RuntimeVisibleAnnotations 等
關鍵結構深度剖析
常量池
採用「表」結構,每項起始一個 tag 標識類型(UTF-8、Integer、Float、Long、Double、Class、String、Fieldref、Methodref、InterfaceMethodref、NameAndType、MethodHandle、MethodType、InvokeDynamic)。
索引從 1 開始,0 表示「不引用任何常量池項目」。
方法表與字節碼
方法表中的 Code 屬性存放編譯後的字節碼指令流,配合 LineNumberTable(行號對應)、LocalVariableTable(局部變數表)支援除錯與反編譯。
為什麼要懂 Class 文件?
- 排查
NoSuchMethodError、IncompatibleClassChangeError 等鏈接錯誤
- 編寫字節碼操作工具、AOP 框架、熱部署模組
- 理解 JVM 類載入、驗證、解析、初始化全流程
- 安全審計:惡意字節碼注入檢測