從 AOT 編譯的二進位檔案中提取 Java 類別資訊
Java 領域的 AOT(Ahead-of-Time,預先編譯)技術一直是一個備受討論的話題,但在 GraalVM 出現之前,沒有任何工具能夠實現良好的 AOT 編譯,更不用說推動整個生態系統了。儘管 GraalVM 提供了 native-image 工具來有效地協助開發者進行 AOT 編譯,但由於 Java 生態系統的複雜性和多樣性,尤其是在各種常用框架中廣泛使用的反射和代理技術,要實現 Java 應用程式的開箱即用 AOT 編譯仍然非常具有挑戰性。
Spring Native 專案
感謝 Spring Framework 團隊的 Spring Native 專案,他們能夠透過 Maven 或 Gradle 外掛實現專案的一鍵 AOT 編譯。但目前僅適用於 Spring Boot 專案。
請使用 Spring Native 來產生 AOT 編譯的 Java 程式
以下是官方 Spring Native 範例,用於產生 AOT 編譯的 Java 應用程式(測試環境:Ubuntu 20.04、Docker 20.10.6)
git clone https://github.com/spring-projects-experimental/spring-native.git
cd spring-native/sample/petclinic-jpa
./build.sh
經過較長的編譯時間和大量的記憶體消耗後,我們可以在 target 目錄中獲得一個 AOT 編譯的 Java 程式。這是一個獨立的二進位檔案,可以在沒有任何依賴的情況下獨立執行。

petclinic-jpa 是由 AOT 編譯的程式,可以直接執行
從 AOT 編譯的二進位檔案中提取 Java 類別資訊
Java 程式碼保護一直是過去非常困難的問題,而 AOT 也被視為 Java 程式碼保護的一種方案。不幸的是,許多 Java 程式現在無法脫離框架。由於框架的複雜性,即使是由 AOT 編譯的程式也必須在最終產生的二進位檔案中包含類別資訊。class 檔案實際上整齊地排列在二進位檔案的資源區域中。
以下工具可以掃描並從 AOT 編譯的二進位檔案中提取類別資訊
以下工具可以掃描並從 AOT 編譯的二進位檔案中提取類別資訊
https://github.com/3-keys/binary-classfile-reader
git clone https://github.com/3-keys/binary-classfile-reader
cd binary-classfile-reader
./gradlew run --args='<path-of-the-binary-file> <output-folder>'
以上一步驟中獲得的 petclinic-jpa 為例,從中提取類別資訊並與原始碼進行比較。您可以看到模型資訊、控制器資訊和服務資訊都可以被獲取。
