从AOT编译的二进制文件中提取Java类信息
AOT编译是Java世界讨论已久的话题,但直到GraalVM出现之前没有工具能够实现较好的AOT编译,更不用说驱动整个生态系统。尽管GraalVM提供了可以有效帮助开发者进行AOT编译的native-image工具,但由于Java生态系统的复杂性和多样性,要实现Java应用程序的开箱即用的AOT编译仍然非常困难,尤其是反射和代理技术在各种常见框架中被广泛使用。
Spring Native 项目
感谢Spring框架团队的Spring Native项目,他们可以通过Maven或Gradle插件实现项目的一键AOT编译。当然,目前只适用于Spring Boot项目。
请使用Sping 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代码保护的一种解决方案,但不幸的是,现在的许多Java程序无法与框架分离,由于框架的复杂性,即使是由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作为例子,从中提取类信息,与源代码进行比较,你可以看到,模型信息,控制器信息,和服务信息都可以获得。
