文章首發於【Java天堂】,跟隨我探索Java進階之路!
Class檔案是什麼
Java Class檔案是Java編譯器將原始碼編譯後的二進位制表示,它是Java虛擬機器(JVM)執行的基礎。
Class檔案絕大部分內容是在1997年釋出的第一版《Java虛擬機器規範》中就已經定義好的,後續20多年的發展過程當中Java經歷了大大小小無數個版本的迭代,加入了很多新的特性,但Class檔案的整體結構沒什麼大的變化,除了支援一些新的特性來擴充套件內容以外,其他內容在這20多年的時間當中基本上沒有變化,這樣的設計對於Java語言本身的相容性和穩定性是大有好處的,不管上層的語言特性如何變化,最終的Class檔案變化不大,Java虛擬機器只需要按照Class的檔案標準來執行就好了。
Class檔案是一組以8個位元組為基礎單位的二進位制流,各個資料專案嚴格按照順序緊湊地排列在檔案之中,中間沒有新增任何分隔符,這使得整個Class檔案中儲存的內容幾乎全部是程式執行的必要資料,沒有空隙存在。當遇到需要佔用8個位元組以上空間的資料項時,則會按照高位在前[插圖]的方式分割成若干個8個位元組進行儲存
檔案格式
Java Class 檔案採用了一種標準的二進位制格式,它由多個部分組成,每個部分都有特定的作用。下面是 Java Class 檔案的基本格式:
魔數(Magic Number)
: Java Class 檔案的前4個位元組是一個固定的魔數,用於識別檔案是否為有效的 Java Class 檔案。魔數的值為0xCAFEBABE。版本資訊(Version)
: 之後的4個位元組分別表示 Java 版本號。前兩個位元組表示主版本號,後兩個位元組表示次版本號。例如,Java 8 的版本號為52.0。常量池(Constant Pool)
: 常量池是 Java Class 檔案的一個重要組成部分,它包含了類中使用的常量,如字串、類名、方法名等。常量池的第一個常量是一個佔位符,後續的常- 量都從1開始計數。訪問標誌(Access Flags)
: 訪問標誌用於描述類或者類的成員的訪問級別,如 public、private、protected 等。類資訊(Class Information)
: 包括類的名稱、父類名稱、介面列表等。欄位表(Field Table)
: 欄位表用於儲存類的成員變數資訊,包括欄位名、型別等。方法表(Method Table)
: 方法表儲存了類的方法資訊,包括方法名、引數列表、返回型別等。屬性表(Attribute Table)
: 屬性表用於儲存額外的資訊,如程式碼行號、異常表、註解等。
示例程式碼
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
編譯HelloWorld.java檔案可以得到HelloWorld.class檔案
javac HelloWorld.java
因為.class檔案是編譯後的二進位制檔案,需要使用特定的工具,才能看到對應的內容。可以使用winhex這個工具開啟檔案,如下圖所示
可以看到前面8個位元組,分別表示魔數、Class檔案的版本號。後面依次是常量池、訪問標誌、類資訊、欄位表、方法表、屬性表
如果有興趣,可以詳細研究一下各個部分的內容和儲存方式,對於理解整個Java檔案執行的過程可以起到一個整體的認識
本文由部落格一文多發平臺 OpenWrite 釋出!