Java Class 文件是 Java 虛擬機(JVM)執行的基本單位,也是 Java 平台實現跨平台特性的關鍵。簡單來說,它是 Java 原始碼經過編譯器編譯後產生的二進制字節碼文件。每個 Class 文件對應一個 Java 類或介面的完整描述,包含了 JVM 執行該類所需的所有資訊。
Class 文件採用類似 C 語言結構體的方式組織數據,主要包含以下核心組成部分:
文件開頭的 4 個字節為魔數(0xCAFEBABE),用於識別該文件是否為合法的 Class 文件。隨後是次版本號和主版本號,標識編譯器版本與目標 JVM 版本。
常量池是 Class 文件中最重要的數據結構之一,也是佔用空間最大的項目之一。它存放了編譯期生成的各種字面量和符號引用,包括:
用於識別該類或介面的訪問層級(public、abstract、final 等)以及是否為類還是介面。
這三項數據確定了類的繼承關係:類索引確定本類全限定名,父類索引確定父類全限定名,介面索引集合確定實現了哪些介面。
描述類中聲明的變量(類變量 static 和實例變量),包含字段的作用域、類型、名稱等資訊。
描述類中聲明的方法,包含方法的作用域、返回類型、參數表、異常表、字節碼指令等核心執行邏輯。
包含了類、字段、方法攜帶的補充資訊,如源文件名、行號表、本地變量表、註解資訊、泛型簽名等。
當 JVM 需要使用某個類時,會經過加載、驗證、準備、解析、初始化五個階段,最終將 Class 文件中的符號引用轉化為直接引用,生成該類的 java.lang.Class 對象作為方法區的數據訪問入口。
想要深入掌握 Class 文件結構,建議學習 javap 反編譯工具的使用,通過 javap -verbose ClassName 可以查看 Class 文件的詳細結構。此外,閱讀《Java 虛擬機規範》第 4 章對 Class 文件格式有最權威的定義。