0Pricing
Java Academy · Lektion

Phasen des Klassenladens: Laden, Verknüpfen, Initialisieren

Gehen Sie das Laden, Überprüfen, Vorbereiten, Auflösen und Initialisieren von Klassen durch.

Phasen des Klassenladens: Laden, Verknüpfen, Initialisieren ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 1 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.

Der Lebenszyklus des Klassenladens

Eine Java-Klasse durchläuft drei Phasen, bevor sie verwendet werden kann: Laden (Bytecode finden und lesen), Verknüpfen (prüfen, vorbereiten, auflösen) und Initialisieren (statische Initialisierer ausführen).

Phase 1: Laden

Der ClassLoader liest die .class-Datei (aus dem Dateisystem, einem JAR, dem Netzwerk oder generiertem Bytecode) und erstellt im Heap ein Class<?>-Objekt, das sie repräsentiert.

// Trigger loading explicitly:
Class<?> c = Class.forName("com.example.MyService");
// The JVM delegates to the appropriate ClassLoader to find and load MyService.class

Phase 2a: Verifizieren

Der Bytecode-Verifizierer prüft, ob der geladene Bytecode strukturell gültig und typsicher ist und den Regeln der JVM-Spezifikation folgt. Ungültiger Bytecode (z. B. durch fehlerhafte Manipulation mit ASM) verursacht einen VerifyError.

Phase 2b: Vorbereiten

Die JVM reserviert Speicher für statische Felder und setzt sie auf ihre Standardwerte (0, false, null). Statische Initialisierer wurden in dieser Phase noch NICHT ausgeführt.

public class Config {
    static int timeout = 30;    // after preparation: timeout = 0 (default)
    static String host = "db"; // after preparation: host = null
    // Both get their real values only after Initialization
}

Phase 2c: Auflösen

Symbolische Referenzen (Klassennamen, Methodensignaturen) im Constant Pool werden durch direkte Referenzen (Zeiger) auf die tatsächlichen Klassen und Methoden ersetzt. Dies kann verzögert erfolgen (Lazy Resolution).

Phase 3: Initialisieren

Statische Initialisierer (static {}-Blöcke) und Zuweisungen an statische Felder werden in Textreihenfolge ausgeführt. In diesem Moment werden timeout = 30 und host = "db" tatsächlich ausgeführt.

public class Config {
    static int timeout;
    static String host;
    static {
        timeout = Integer.parseInt(System.getenv("TIMEOUT"));
        host    = System.getenv("DB_HOST");
        System.out.println("Config initialized");
    }
}

Auslöser der Klasseninitialisierung

Die Initialisierung wird erstmals ausgelöst durch: (1) die Erzeugung einer Instanz, (2) den Zugriff auf ein statisches Feld (das keine Konstante ist), (3) den Aufruf einer statischen Methode, (4) Reflection über Class.forName() (mit initialize=true) oder (5) die Initialisierung einer Unterklasse.

// forName with initialize=false skips static initializers:
Class<?> c = Class.forName("com.example.MyService", false, loader);

Die <clinit>-Methode

Die JVM erzeugt aus allen statischen Initialisierern und Zuweisungen an statische Felder eine <clinit>-Methode (Klasseninitialisierer). Sie wird genau einmal ausgeführt und ist thread-sicher – die JVM garantiert gegenseitigen Ausschluss.

ExceptionInInitializerError

Wenn ein statischer Initialisierer eine Exception auslöst, verpackt die JVM sie in ExceptionInInitializerError. Nachfolgende Versuche, die Klasse zu verwenden, lösen NoClassDefFoundError aus.

static {
    if (System.getenv("DB_URL") == null)
        throw new RuntimeException("DB_URL not set"); // wrapped in ExceptionInInitializerError
}

Reihenfolge der statischen Initialisierung

Statische Initialisierer werden in ihrer textuellen Reihenfolge ausgeführt. Zirkuläre Klassenabhängigkeiten während der Initialisierung können zu teilweise initialisierten Klassen führen – eine bekannte Falle beim Initialization-on-Demand-Holder-Pattern.

class A {
    static final int X = B.Y + 1; // accesses B before B is initialized!
}
class B {
    static final int Y = A.X + 1; // circular!
}

Klassenladen beobachten

Aktivieren Sie die Protokollausgabe zum Klassenladen mit -Xlog:class+load=info (JVM 9+), um zu sehen, welche Klassen geladen werden, aus welcher Quelle sie stammen und welcher ClassLoader sie lädt.

// JVM flag:
// java -Xlog:class+load=info:file=classload.log MyApp
// Output lines like:
// [info][class,load] com.example.MyService source: file:///app/app.jar

Schnelltest

Während welcher Phase werden statische Initialisierer ausgeführt?

Zusammenfassung

Laden: Bytecode lesen. Verknüpfen: überprüfen → vorbereiten (Nullstandardwerte) → auflösen (symbolische Verweise). Initialisieren: <clinit> ausführen. Die Initialisierung wird bei der ersten Verwendung ausgelöst und ist thread-sicher. Zirkuläre Abhängigkeiten während der Initialisierung führen zu subtilen Fehlern.

Häufig gestellte Fragen

Ist die Lektion „Phasen des Klassenladens: Laden, Verknüpfen, Initialisieren“ kostenlos?

Ja — der vollständige Text von „Phasen des Klassenladens: Laden, Verknüpfen, Initialisieren“ 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 „Phasen des Klassenladens: Laden, Verknüpfen, Initialisieren“?

Gehen Sie das Laden, Überprüfen, Vorbereiten, Auflösen und Initialisieren von Klassen durch. 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 1 von 4.

Wie lange dauert die Lektion „Phasen des Klassenladens: Laden, Verknüpfen, Initialisieren“?

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

  1. Phasen des Klassenladens: Laden, Verknüpfen, Initialisieren
  2. ClassLoader-Hierarchie und eigene Loader
  3. Bytecode mit javap untersuchen
  4. JIT-Kompilierung und Tiered Compilation
← Zurück zu Java Academy