Extraindo informações de classes Java de arquivos binários compilados por AOT

A compilação ahead-of-time (AOT) no mundo Java tem sido um tópico de debate por muito tempo, mas até o surgimento do GraalVM, não havia uma ferramenta que pudesse alcançar boa compilação AOT, muito menos impulsionar todo o ecossistema. Apesar do GraalVM fornecer a ferramenta native-image para auxiliar efetivamente os desenvolvedores na compilação AOT, alcançar compilação AOT pronta para uso para aplicações Java ainda é muito desafiador devido à complexidade e diversidade do ecossistema Java, especialmente com tecnologias de reflexão e proxy amplamente utilizadas em vários frameworks comuns.

Projeto Spring Native

Graças ao projeto Spring Native da equipe do Spring Framework, eles são capazes de alcançar compilação AOT com um clique de projetos através de plugins Maven ou Gradle. No entanto, atualmente só é aplicável a projetos Spring Boot.

Use o Spring Native para gerar programas Java compilados por AOT

Aqui estão os exemplos oficiais do Spring Native para gerar aplicações Java compiladas por AOT (Ambiente de teste: 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

Após um tempo de compilação relativamente longo e grande consumo de memória, podemos obter um programa Java compilado por AOT no diretório target. Este é um arquivo binário independente que pode ser executado de forma independente sem nenhuma dependência.

img

petclinic-jpa é um programa compilado por AOT e pode ser executado diretamente

Extrair informações de classes Java de arquivos binários compilados por AOT

A proteção de código Java sempre foi um problema muito difícil no passado, e a compilação AOT também é considerada uma solução para proteção de código Java. Infelizmente, muitos programas Java agora não conseguem se separar do framework. Devido à complexidade do framework, mesmo programas compilados por AOT devem incluir informações de classes no arquivo binário final gerado. Os arquivos class estão na verdade ordenadamente organizados na área de recursos do arquivo binário.

As seguintes ferramentas podem escanear e extrair informações de classes de arquivos binários compilados por 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 foi obtido no passo anterior, como exemplo, extraia as informações de classe dele e compare com o código-fonte. Você pode ver que informações de modelo, informações de controller e informações de serviço podem ser obtidas.

img