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$PlatformClassLoaderApplication (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$AppClassLoaderDelegaçã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
- Fases de Carregamento de Classes: Carregar, Vincular e Inicializar
- Hierarquia de ClassLoader e Carregadores Personalizados
- Inspecionando bytecode com javap
- Compilação JIT e compilação em camadas