如果你還不瞭解 Java Class 檔案結構,來看看這篇吧

果子爸聊技术發表於2024-05-08

文章首發於【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這個工具開啟檔案,如下圖所示

pkVt44U.png

可以看到前面8個位元組,分別表示魔數、Class檔案的版本號。後面依次是常量池、訪問標誌、類資訊、欄位表、方法表、屬性表

如果有興趣,可以詳細研究一下各個部分的內容和儲存方式,對於理解整個Java檔案執行的過程可以起到一個整體的認識

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章