Извлечение информации о классах Java из бинарных файлов, скомпилированных AOT

Предварительная (AOT) компиляция в мире Java долгое время была предметом дискуссий, но до появления GraalVM не существовало инструмента, способного обеспечить качественную AOT-компиляцию, не говоря уже о продвижении всей экосистемы. Несмотря на то, что GraalVM предоставляет инструмент native-image для эффективной помощи разработчикам в AOT-компиляции, достижение готовой к использованию AOT-компиляции для Java-приложений по-прежнему остаётся очень сложной задачей из-за сложности и разнообразия экосистемы Java, особенно с широким использованием технологий рефлексии и проксирования в различных распространённых фреймворках.

Проект Spring Native

Благодаря проекту Spring Native от команды Spring Framework они смогли обеспечить AOT-компиляцию проектов одним кликом через плагины Maven или Gradle. Однако в настоящее время это применимо только к проектам 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-программу в директории target. Это автономный бинарный файл, который может работать независимо без каких-либо зависимостей.

img

petclinic-jpa — это программа, скомпилированная AOT, которая может запускаться напрямую.

Извлечение информации о классах Java из AOT-скомпилированных бинарных файлов

Защита 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, полученный на предыдущем шаге, в качестве примера: извлекаем информацию о классах и сравниваем с исходным кодом. Можно увидеть, что информация о моделях, контроллерах и сервисах может быть получена.

img