Extrayendo información de clase de Java de archivos binarios compilados por AOT

La compilación anticipada (AOT) en el mundo Java ha sido un tema de debate durante mucho tiempo, pero hasta la aparición de GraalVM, no existía ninguna herramienta que pudiera lograr una buena compilación AOT, y mucho menos impulsar todo el ecosistema. A pesar de que GraalVM proporciona la herramienta de imagen nativa para ayudar eficazmente a los desarrolladores en la compilación AOT, lograr una compilación AOT lista para usar para aplicaciones Java sigue siendo un gran desafío debido a la complejidad y diversidad del ecosistema Java, especialmente con las tecnologías de reflexión y proxy. ampliamente utilizado en varios marcos comunes.

Proyecto Spring Native

Gracias al proyecto Spring Native del equipo de Spring Framework, pueden lograr una compilación AOT de proyectos con un solo clic a través de complementos de Maven o Gradle. Sin embargo, actualmente solo es aplicable a proyectos Spring Boot.

Utilice Sping Native para generar programas Java compilados AOT

Aquí están los ejemplos oficiales de Spring Native para generar aplicaciones Java compiladas con AOT (entorno de prueba: 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

Después de un tiempo de compilación relativamente largo y una gran cantidad de consumo de memoria, podemos obtener un programa Java compilado con AOT en el directorio de destino. Este es un archivo binario independiente que puede ejecutarse de forma independiente sin dependencias.

img

petclinic-jpa es un programa compilado por AOT y puede ejecutarse directamente

Extraer información de clase Java de archivos binarios compilados AOT

La protección del código Java siempre ha sido un problema muy difícil en el pasado y AOT también se considera una solución para la protección del código Java. Desafortunadamente, muchos programas Java ahora no pueden separarse del marco. Debido a la complejidad del marco, incluso los programas compilados por AOT deben incluir información de clase en el archivo binario final generado. En realidad, los archivos de clase están ordenados de forma ordenada en el área de recursos del archivo binario.

Las siguientes herramientas pueden escanear y extraer información de clase de archivos binarios compilados en AOT

Las siguientes herramientas pueden escanear y extraer información de clase de archivos binarios compilados en 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>'

Usando petclinic-jpa, que se obtuvo en el paso anterior, como ejemplo, extraiga la información de la clase y compárela con el código fuente. Puede ver que se puede obtener información del modelo, información del controlador e información de servicio.

img