ClassLoader-Hierarchie und eigene Loader
Verstehen Sie Bootstrap-, Plattform- und Anwendungs-ClassLoader und schreiben Sie einen eigenen ClassLoader.
ClassLoader-Hierarchie und eigene Loader ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Die ClassLoader-Hierarchie
Die JVM verwendet eine Hierarchie von ClassLoadern. Jeder Loader hat einen übergeordneten Loader. Bevor er eine Klasse selbst lädt, delegiert er den Vorgang an den übergeordneten Loader (Parent-First-Delegationsmodell).
Bootstrap ClassLoader
Der Bootstrap ClassLoader lädt zentrale JDK-Klassen (java.lang.*, java.util.*). Er ist in nativem Code implementiert und hat keinen übergeordneten Java-Loader; getParent() gibt null zurück.
ClassLoader cl = String.class.getClassLoader();
System.out.println(cl); // null (bootstrap ClassLoader)Platform ClassLoader (Java 9+)
Der Platform ClassLoader (früher Extension ClassLoader) lädt Module aus dem JDK, die nicht zur Bootstrap-Menge gehören (java.sql, java.xml usw.). Sein übergeordneter Loader ist der Bootstrap ClassLoader.
ClassLoader platform = ClassLoader.getPlatformClassLoader();
System.out.println(platform.getClass().getName());
// jdk.internal.loader.ClassLoaders$PlatformClassLoaderApplication (System) ClassLoader
Der Application ClassLoader lädt Anwendungsklassen aus dem Classpath (-cp / CLASSPATH). Sein übergeordneter Loader ist der Platform ClassLoader. Er ist der Standard-Loader für Benutzercode.
ClassLoader app = ClassLoader.getSystemClassLoader();
System.out.println(app.getClass().getName());
// jdk.internal.loader.ClassLoaders$AppClassLoaderParent-First-Delegation
Beim Laden von com.example.MyService fragt der AppClassLoader zuerst seinen übergeordneten Loader (Platform), der wiederum den Bootstrap ClassLoader fragt. Nur wenn keiner der übergeordneten Loader die Klasse laden kann, versucht der untergeordnete Loader, sie selbst zu laden.
Klassenidentität und ClassLoader
Zwei Klassen mit demselben Namen, die von unterschiedlichen ClassLoadern geladen wurden, gelten als unterschiedliche Typen. Eine Typumwandlung zwischen ihnen löst ClassCastException aus – das ist in Plugin-Systemen und OSGi wichtig.
// 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!Einen eigenen ClassLoader schreiben
Erweitern Sie ClassLoader und überschreiben Sie findClass(String name). Lesen Sie Bytecode aus einer benutzerdefinierten Quelle (verschlüsseltes JAR, Netzwerk, Datenbank) und rufen Sie defineClass auf.
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: Aus JARs laden
URLClassLoader lädt Klassen aus einer Liste von URLs (Dateipfade oder HTTP-URLs). Das ist nützlich für Plugin-Systeme, die zur Laufzeit JARs hinzufügen.
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();
}ClassLoader schließen
Schließen Sie URLClassLoader immer, wenn Sie ihn nicht mehr benötigen – er hält JARs geöffnet. Durch das Schließen können die JARs gelöscht oder aktualisiert werden. Verwenden Sie Try-with-resources.
Child-First-Delegation (isoliertes Laden)
Einige Container (Tomcat, Spring Boot Fat JAR) kehren die Hierarchie um: Der untergeordnete Loader versucht es zuerst und greift nur dann auf den übergeordneten Loader zurück, wenn die Klasse nicht gefunden wird. Dadurch werden Bibliotheksversionen zwischen Webanwendungen voneinander isoliert.
ClassLoader-Leaks
Ein ClassLoader wird erst durch die Garbage Collection freigegeben, wenn keine von ihm geladene Klasse mehr erreichbar ist. Statische Felder, die Objekte aus einer geladenen Klasse referenzieren, halten den Loader am Leben – ein häufiges Leak bei Redeployments.
Schnelltest
Was tut ein ClassLoader, bevor er versucht, eine Klasse selbst zu laden?
Zusammenfassung
Dreistufige Hierarchie: Bootstrap → Platform → Application. Parent-First-Delegation verhindert doppelte Klassen. Eigene Loader überschreiben findClass. Verwenden Sie URLClassLoader für Plugin-Systeme. Schließen Sie Loader, um Leaks zu verhindern.
Häufig gestellte Fragen
Ist die Lektion „ClassLoader-Hierarchie und eigene Loader“ kostenlos?
Ja — der vollständige Text von „ClassLoader-Hierarchie und eigene Loader“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „ClassLoader-Hierarchie und eigene Loader“?
Verstehen Sie Bootstrap-, Plattform- und Anwendungs-ClassLoader und schreiben Sie einen eigenen ClassLoader. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Java Academy zu starten?
Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „ClassLoader-Hierarchie und eigene Loader“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?
Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Phasen des Klassenladens: Laden, Verknüpfen, Initialisieren
- ClassLoader-Hierarchie und eigene Loader
- Bytecode mit javap untersuchen
- JIT-Kompilierung und Tiered Compilation