从 AOT 编译的二进制文件中提取 Java 类信息
Java 世界中的提前编译 (AOT) 一直是人们热议的话题,但在 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
经过较长的编译时间和大量的内存消耗后,我们可以在目标目录中获得一个AOT编译的Java程序。这是一个独立的二进制文件,可以独立运行,无需任何依赖项。

petclinic-jpa 是由 AOT 编译的程序,可以直接运行。
从 AOT 编译的二进制文件中提取 Java 类信息
Java 代码保护一直以来都是一个棘手的问题,AOT 也被视为一种解决方案。然而,很多 Java 程序现在仍然无法脱离框架。由于框架的复杂性,即使是使用 AOT 编译的程序,最终生成的二进制文件中也必须包含类信息。这些类文件实际上被整齐地排列在二进制文件的资源区域中。
以下工具可以扫描并从 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 为例,提取其中的类信息并与源代码进行比较。可以看出,模型信息、控制器信息和服务信息均可获取。
