0Pricing
Java Academy · Aula

Hierarquia de ClassLoader e Carregadores Personalizados

Compreenda os carregadores de classes de inicialização, de plataforma e de aplicação e escreva um ClassLoader personalizado.

Hierarquia de ClassLoader e Carregadores Personalizados é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 2 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.

A hierarquia de ClassLoader

A JVM usa uma hierarquia de ClassLoaders. Cada carregador tem um pai; antes de carregar uma classe por conta própria, ele delega ao pai (modelo de delegação do pai primeiro).

Bootstrap ClassLoader

O Bootstrap ClassLoader carrega as classes centrais do JDK (java.lang.*, java.util.*). Ele é implementado em código nativo e não tem um pai Java; getParent() retorna null.

ClassLoader cl = String.class.getClassLoader();
System.out.println(cl); // null (bootstrap ClassLoader)

Platform ClassLoader (Java 9 ou posterior)

O Platform ClassLoader (anteriormente Extension ClassLoader) carrega módulos do JDK que não fazem parte do conjunto do bootstrap (java.sql, java.xml etc.). Seu pai é o carregador de bootstrap.

ClassLoader platform = ClassLoader.getPlatformClassLoader();
System.out.println(platform.getClass().getName());
// jdk.internal.loader.ClassLoaders$PlatformClassLoader

Application (System) ClassLoader

O Application ClassLoader carrega classes da aplicação a partir do caminho de classes (-cp / CLASSPATH). Seu pai é o Platform ClassLoader. Ele é o carregador padrão para o código do usuário.

ClassLoader app = ClassLoader.getSystemClassLoader();
System.out.println(app.getClass().getName());
// jdk.internal.loader.ClassLoaders$AppClassLoader

Delegação do pai primeiro

Ao carregar com.example.MyService, o AppClassLoader primeiro consulta seu pai (Platform), que consulta o Bootstrap. Somente quando nenhum dos pais consegue carregá-la é que o filho tenta carregá-la por conta própria.

Identidade de classes e ClassLoaders

Duas classes com o mesmo nome, carregadas por ClassLoaders diferentes, são consideradas tipos diferentes. Fazer a conversão entre elas lança ClassCastException — algo importante em sistemas de plug-ins e no OSGi.

// Loaded by two different loaders → different Class objects
Class<?> c1 = loader1.loadClass("com.example.Plugin");
Class<?> c2 = loader2.loadClass("com.example.Plugin");
System.out.println(c1 == c2); // false!

Escrevendo um ClassLoader personalizado

Estenda ClassLoader e substitua findClass(String name). Leia o bytecode de uma fonte personalizada (JAR criptografado, rede ou banco de dados) e chame defineClass.

public class EncryptedClassLoader extends ClassLoader {
    public EncryptedClassLoader(ClassLoader parent) { super(parent); }
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] bytes = decrypt(readBytecodeFromVault(name));
        return defineClass(name, bytes, 0, bytes.length);
    }
}

URL ClassLoader: carregando de JARs

URLClassLoader carrega classes de uma lista de URLs (caminhos de arquivos ou URLs HTTP). É útil para sistemas de plug-ins que adicionam JARs em tempo de execução.

URL[] urls = { new File("plugins/my-plugin.jar").toURI().toURL() };
try (URLClassLoader loader = new URLClassLoader(urls, getClass().getClassLoader())) {
    Class<?> cls = loader.loadClass("com.example.PluginImpl");
    Plugin plugin = (Plugin) cls.getDeclaredConstructor().newInstance();
    plugin.start();
}

Fechando ClassLoaders

Sempre feche URLClassLoader quando terminar — ele mantém os JARs abertos. Fechá-lo permite excluir ou atualizar os JARs. Use try-with-resources.

Delegação do filho primeiro (carregamento isolado)

Alguns contêineres (Tomcat, JAR abrangente do Spring Boot) invertem a hierarquia: o carregador filho tenta primeiro, recorrendo ao pai somente quando não encontra a classe. Isso isola as versões das bibliotecas entre aplicações web.

Vazamentos de ClassLoader

Um carregador de classes só é coletado pelo GC quando nenhuma classe carregada por ele pode mais ser alcançada. Campos estáticos que mantêm objetos de uma classe carregada mantêm o carregador ativo — um vazamento comum em cenários de nova implantação.

Verificação rápida

O que um ClassLoader faz antes de tentar carregar uma classe por conta própria?

Recapitulação

Hierarquia de três níveis: Bootstrap → Platform → Application. A delegação do pai primeiro evita a duplicação de classes. Carregadores personalizados substituem findClass. Use URLClassLoader em sistemas de plug-ins. Feche os carregadores para evitar vazamentos.

Perguntas Frequentes

A aula “Hierarquia de ClassLoader e Carregadores Personalizados” é grátis?

Sim — o texto completo de “Hierarquia de ClassLoader e Carregadores Personalizados” é 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 “Hierarquia de ClassLoader e Carregadores Personalizados”?

Compreenda os carregadores de classes de inicialização, de plataforma e de aplicação e escreva um ClassLoader personalizado. 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 2 de 4.

Quanto tempo leva a aula “Hierarquia de ClassLoader e Carregadores Personalizados”?

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. Fases de Carregamento de Classes: Carregar, Vincular e Inicializar
  2. Hierarquia de ClassLoader e Carregadores Personalizados
  3. Inspecionando bytecode com javap
  4. Compilação JIT e compilação em camadas
← Voltar para Java Academy