Gerarchia dei ClassLoader e loader personalizzati
Comprenda i class loader bootstrap, platform e application e scriva un ClassLoader personalizzato.
Gerarchia dei ClassLoader e loader personalizzati è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.
La gerarchia dei ClassLoader
La JVM utilizza una gerarchia di ClassLoader. Ogni loader ha un parent; prima di caricare autonomamente una classe, delega l'operazione al parent (modello di delega parent-first).
Bootstrap ClassLoader
Il Bootstrap ClassLoader carica le classi principali del JDK (java.lang.*, java.util.*). È implementato in codice nativo e non ha un parent Java; getParent() restituisce null.
ClassLoader cl = String.class.getClassLoader();
System.out.println(cl); // null (bootstrap ClassLoader)Platform ClassLoader (Java 9+)
Il Platform ClassLoader (in precedenza Extension ClassLoader) carica i moduli del JDK che non fanno parte dell'insieme bootstrap (java.sql, java.xml ecc.). Il suo parent è il loader bootstrap.
ClassLoader platform = ClassLoader.getPlatformClassLoader();
System.out.println(platform.getClass().getName());
// jdk.internal.loader.ClassLoaders$PlatformClassLoaderApplication (System) ClassLoader
L'Application ClassLoader carica le classi dell'applicazione dal classpath (-cp / CLASSPATH). Il suo parent è il Platform ClassLoader. È il loader predefinito per il codice dell'utente.
ClassLoader app = ClassLoader.getSystemClassLoader();
System.out.println(app.getClass().getName());
// jdk.internal.loader.ClassLoaders$AppClassLoaderDelega parent-first
Quando carica com.example.MyService, l'AppClassLoader chiede prima al suo parent (Platform), che a sua volta chiede a Bootstrap. Solo se nessuno dei parent riesce a caricarla, il loader figlio prova a caricarla autonomamente.
Identità delle classi e ClassLoader
Due classi con lo stesso nome caricate da ClassLoader diversi sono considerate tipi differenti. Il cast tra di esse genera ClassCastException: un aspetto importante nei sistemi a plugin e in 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!Scrivere un ClassLoader personalizzato
Estenda ClassLoader e sovrascriva findClass(String name). Legga il bytecode da una sorgente personalizzata (JAR crittografato, rete, database) e chiami 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: caricare da JAR
URLClassLoader carica le classi da un elenco di URL (percorsi di file o URL HTTP). È utile nei sistemi a plugin che aggiungono JAR durante l'esecuzione.
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();
}Chiudere i ClassLoader
Chiuda sempre URLClassLoader al termine: mantiene aperti i JAR. La sua chiusura consente di eliminare o aggiornare i JAR. Utilizzi try-with-resources.
Delega child-first (caricamento isolato)
Alcuni container (Tomcat, fat JAR di Spring Boot) invertono la gerarchia: il loader figlio prova per primo e ricorre al parent solo se non trova la classe. In questo modo le versioni delle librerie vengono isolate tra le applicazioni Web.
Perdite di memoria dei ClassLoader
Un ClassLoader viene raccolto dal GC solo quando nessuna classe caricata da esso è raggiungibile. I campi statici che contengono oggetti di una classe caricata mantengono attivo il loader: una perdita comune negli scenari di redeploy.
Verifica rapida
Che cosa fa un ClassLoader prima di provare a caricare autonomamente una classe?
Riepilogo
Gerarchia a tre livelli: Bootstrap → Platform → Application. La delega parent-first impedisce la duplicazione delle classi. I loader personalizzati sovrascrivono findClass. Utilizzi URLClassLoader per i sistemi a plugin. Chiuda i loader per prevenire le perdite di memoria.
Domande Frequenti
La lezione «Gerarchia dei ClassLoader e loader personalizzati» è gratuita?
Sì — il testo completo di «Gerarchia dei ClassLoader e loader personalizzati» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.
Cosa imparerò in «Gerarchia dei ClassLoader e loader personalizzati»?
Comprenda i class loader bootstrap, platform e application e scriva un ClassLoader personalizzato. Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Java Academy?
Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Gerarchia dei ClassLoader e loader personalizzati»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Java Academy?
Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Fasi del caricamento delle classi: load, link, initialize
- Gerarchia dei ClassLoader e loader personalizzati
- Ispezionare il bytecode con javap
- Compilazione JIT e compilazione a livelli