Jak wygląda proces ładowania klas?
Proces ładowania klas w Java składa się z kilku etapów. Jest to dynamiczny proces, który zachodzi podczas uruchamiania programu Java. Poniżej przedstawiam ogólny przebieg tego procesu:
-
Ładowanie: Proces zaczyna się od ładowania klas. Klasa
ClassLoaderjest odpowiedzialna za to zadanie. Wartościowa jest hierarchia ładowarek klas, zaczynając od Bootstrap Class Loader, a następnie System Class Loader, Extension Class Loader, oraz ewentualnie niestandardowe ładowarki klas utworzone przez programistę. -
Linkowanie: Po pomyślnym załadowaniu klasy przechodzą przez etap linkowania, który składa się z trzech faz:
- Verification (Weryfikacja): Sprawdza się, czy załadowana klasa jest poprawna z punktu widzenia semantyki języka Java.
- Preparation (Przygotowanie): Tworzone są miejsca w pamięci statycznej dla zmiennych klas.
- Resolution (Rozwiązywanie): Adresy symboliczne w kodzie klasy są zamieniane na konkretne odniesienia do funkcji i zmiennych.
-
Inicjalizacja: Kolejnym krokiem jest inicjalizacja klasy. Jeśli klasa zawiera statyczne bloki kodu (static blocks) lub statyczne zmienne, to są one wykonane lub zainicjowane w tym etapie. Inicjalizacja odbywa się tylko raz, gdy klasa jest używana po raz pierwszy.
Tworzenie egzemplarzy (instancji): Gdy klasa jest załadowana, zlinkowana i zainicjowana, można tworzyć egzemplarze (instancje) tej klasy w trakcie działania programu, korzystając z operatora new lub innych metod tworzenia obiektów.
Używanie klas: Kiedy klasy zostały załadowane, zlinkowane, zainicjowane i ewentualnie utworzone instancje, można używać ich w programie. To właśnie etap, w którym program korzysta z funkcji i danych dostarczanych przez te klasy.
Warto zaznaczyć, że cały proces ładowania klas jest dynamiczny, co oznacza, że klasy są ładowane w momencie, gdy są potrzebne (lazy loading). Mechanizm ten przyczynia się do efektywności i elastyczności w zarządzaniu pamięcią oraz uruchamianiu programów w środowisku JVM. Hierarchia ładowarek klas oraz model delegacji są kluczowe dla tego procesu i pozwalają na skomplikowane struktury klas w różnych miejscach programu.

