0Pricing
Java Academy · Lekcja

Fazy ładowania klas: Load, Link, Initialize

Prześledź ładowanie, weryfikację, przygotowanie, rozwiązywanie odwołań i inicjalizację klas.

Fazy ładowania klas: Load, Link, Initialize to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Cykl życia ładowania klasy

Zanim klasa Java będzie mogła zostać użyta, przechodzi trzy fazy: ładowanie (odnalezienie i odczytanie kodu bajtowego), łączenie (weryfikacja, przygotowanie i rozwiązywanie odwołań) oraz inicjalizacja (uruchomienie inicjalizatorów statycznych).

Faza 1: ładowanie

ClassLoader odczytuje plik .class (z systemu plików, pliku JAR, sieci lub wygenerowanego kodu bajtowego) i tworzy na stercie obiekt Class<?>, który go reprezentuje.

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

Faza 2a: weryfikacja

Weryfikator kodu bajtowego sprawdza, czy załadowany kod bajtowy jest poprawny strukturalnie, bezpieczny typowo i zgodny z regułami specyfikacji JVM. Nieprawidłowy kod bajtowy (np. niepoprawnie zmodyfikowany za pomocą ASM) powoduje błąd VerifyError.

Faza 2b: przygotowanie

JVM przydziela pamięć dla pól statycznych i ustawia ich wartości domyślne (0, false, null). Inicjalizatory statyczne NIE zostały jeszcze uruchomione na tym etapie.

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
}

Faza 2c: rozwiązywanie odwołań

Odwołania symboliczne (nazwy klas, sygnatury metod) w puli stałych są zastępowane bezpośrednimi odwołaniami (wskaźnikami) do rzeczywistych klas i metod. Rozwiązywanie może zostać odroczone (rozwiązywanie leniwe).

Faza 3: inicjalizacja

Inicjalizatory statyczne (bloki static {}) i przypisania do pól statycznych są wykonywane w kolejności tekstowej. Wtedy właśnie faktycznie wykonują się instrukcje timeout = 30 i host = "db".

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");
    }
}

Wyzwalacze inicjalizacji klas

Inicjalizacja jest wykonywana przy pierwszym: (1) utworzeniu instancji, (2) dostępie do pola statycznego (niebędącego stałą), (3) wywołaniu metody statycznej, (4) użyciu refleksji za pośrednictwem Class.forName() (z initialize=true), (5) zainicjalizowaniu podklasy.

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

Metoda <clinit>

JVM generuje metodę <clinit> (inicjalizator klasy) na podstawie wszystkich inicjalizatorów statycznych i przypisań do pól statycznych. Jest wykonywana dokładnie raz i jest bezpieczna wątkowo — JVM gwarantuje wzajemne wykluczanie.

ExceptionInInitializerError

Jeśli inicjalizator statyczny zgłosi wyjątek, JVM opakuje go w ExceptionInInitializerError. Kolejne próby użycia klasy spowodują zgłoszenie NoClassDefFoundError.

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

Kolejność inicjalizacji statycznej

Inicjalizatory statyczne są wykonywane w kolejności występowania w kodzie. Cykliczne zależności klas podczas inicjalizacji mogą prowadzić do częściowo zainicjalizowanych klas — to znana pułapka wzorca Initialization-on-Demand Holder.

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!
}

Obserwowanie ładowania klas

Włącz wyjście dziennika ładowania klas za pomocą -Xlog:class+load=info (JVM 9+), aby zobaczyć, które klasy są ładowane, skąd pochodzą i przez który ClassLoader.

// 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

Szybkie sprawdzenie

W której fazie wykonywane są inicjalizatory statyczne?

Podsumowanie

Ładowanie: odczyt kodu bajtowego. Łączenie: weryfikacja → przygotowanie (zerowe wartości domyślne) → rozwiązywanie (odwołania symboliczne). Inicjalizacja: wykonanie <clinit>. Inicjalizacja jest wyzwalana przez pierwsze użycie i jest bezpieczna wątkowo. Cykliczne zależności podczas inicjalizacji prowadzą do trudnych do wykrycia błędów.

Często zadawane pytania

Czy lekcja „Fazy ładowania klas: Load, Link, Initialize” jest bezpłatna?

Tak — pełny tekst „Fazy ładowania klas: Load, Link, Initialize” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Fazy ładowania klas: Load, Link, Initialize”?

Prześledź ładowanie, weryfikację, przygotowanie, rozwiązywanie odwołań i inicjalizację klas. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Fazy ładowania klas: Load, Link, Initialize”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Fazy ładowania klas: Load, Link, Initialize
  2. Hierarchia ClassLoader i własne ładowarki
  3. Inspekcja kodu bajtowego za pomocą javap
  4. Kompilacja JIT i kompilacja warstwowa
← Powrót do Java Academy