0Pricing
Java Academy · Aula

Reflexão e configuração

Lide com recursos dinâmicos.

Reflexão e configuração é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.

Reflexão e configuração

A análise de mundo fechado do native-image só consegue enxergar o código que pode rastrear estaticamente. Recursos dinâmicos — reflexão, proxies, recursos e serialização — ocultam seus alvos do analisador. Nesta lição, você aprenderá a fazê-los funcionar em um binário nativo.

O problema da reflexão

Quando você procura uma classe pelo nome a partir de uma string, o analisador não consegue saber qual classe você quer dizer. Se essa classe não puder ser alcançada de outra forma, ela será excluída da imagem e a procura falhará durante a execução.

public class Main {
    public static void main(String[] args) throws Exception {
        String name = "java.util.ArrayList"; // could come from config
        Class<?> c = Class.forName(name);
        System.out.println("Loaded: " + c.getSimpleName());
    }
}

Metadados de alcançabilidade

A solução são os metadados de alcançabilidade: arquivos JSON que informam ao native-image quais classes, métodos e campos são acessados dinamicamente. A compilação então os mantém e registra seus membros.

reflect-config.json

Uma entrada de reflexão nomeia a classe e os membros que devem ser mantidos. Este trecho está em JSON, não em Java — ele fica em META-INF/native-image/.

[
  {
    "name": "com.example.Person",
    "allDeclaredConstructors": true,
    "allDeclaredMethods": true,
    "fields": [ { "name": "age" } ]
  }
]

O agente de rastreamento

Escrever metadados manualmente é trabalhoso. Execute seu aplicativo na JVM com o agente de rastreamento (-agentlib:native-image-agent=config-output-dir=...). Ele registra todos os acessos dinâmicos durante uma execução real e gera automaticamente os arquivos de configuração.

Exercite os caminhos do seu código

O agente só registra o que é realmente executado, portanto você precisa conduzir o aplicativo por todos os seus recursos — execute seus testes com ele. Qualquer caminho reflexivo que você não percorrer ficará ausente dos metadados e causará uma falha na compilação nativa.

Proxies dinâmicos

Os proxies dinâmicos do JDK precisam de um proxy-config.json que liste os conjuntos de interfaces que serão usados pelos proxies. O analisador não consegue inferir esses conjuntos porque a lista de interfaces é montada durante a execução.

Recursos

Arquivos carregados por meio de getResourceAsStream não são incorporados automaticamente. Um resource-config.json com padrões glob informa ao native-image quais recursos devem ser incluídos no executável.

public class Main {
    public static void main(String[] args) {
        var url = Main.class.getResource("/banner.txt");
        System.out.println("Resource present: " + (url != null));
    }
}

Serialização e JNI

A serialização de Java e as chamadas nativas (JNI) também são dinâmicas. Cada uma tem seu próprio arquivo de configuração (serialization-config.json, jni-config.json). O agente de rastreamento também gera esses arquivos quando esses caminhos são executados.

Registro programático

Autores de bibliotecas podem registrar metadados no código usando uma Feature por meio da API RuntimeReflection, executada no momento da compilação. Isso inclui a configuração correta dentro da biblioteca, para que os usuários não precisem fazer nenhuma configuração manual.

Repositório compartilhado de metadados

GraalVM mantém um repositório comunitário de metadados de alcançabilidade com configurações pré-criadas para bibliotecas populares. As ferramentas de compilação nativa podem obtê-las automaticamente, fazendo com que frameworks comuns funcionem sem configuração adicional.

Verificação rápida

Teste sua compreensão sobre recursos dinâmicos em imagens nativas.

Recapitulação

Você aprendeu a lidar com recursos dinâmicos:

  • Reflexão, proxies, recursos, serialização e JNI são invisíveis para a análise estática.
  • Arquivos JSON de metadados de alcançabilidade os declaram para o native-image.
  • O agente de rastreamento gera automaticamente a configuração a partir de uma execução real na JVM.
  • Percorra todos os caminhos do código (especialmente os testes) para que nada seja esquecido.
  • Use o repositório compartilhado de metadados para bibliotecas populares.

Perguntas Frequentes

A aula “Reflexão e configuração” é grátis?

Sim — o texto completo de “Reflexão e configuração” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.

O que vou aprender em “Reflexão e configuração”?

Lide com recursos dinâmicos. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Java Academy?

Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Reflexão e configuração”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Java Academy?

Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. O que é GraalVM
  2. Criando uma imagem nativa
  3. Reflexão e configuração
  4. Compromissos da imagem nativa
← Voltar para Java Academy