Hierarchia ClassLoader i własne ładowarki
Poznaj ładowarki klas bootstrap, platform i application oraz napisz własny ClassLoader.
Hierarchia ClassLoader i własne ładowarki to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 2 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.
Hierarchia ClassLoaderów
JVM korzysta z hierarchii ClassLoaderów. Każdy ClassLoader ma rodzica; przed samodzielnym załadowaniem klasy deleguje to zadanie rodzicowi (model delegowania parent-first).
Bootstrap ClassLoader
Bootstrap ClassLoader ładuje podstawowe klasy JDK (java.lang.*, java.util.*). Jest zaimplementowany w kodzie natywnym i nie ma rodzica w Javie; metoda getParent() zwraca null.
ClassLoader cl = String.class.getClassLoader();
System.out.println(cl); // null (bootstrap ClassLoader)Platform ClassLoader (Java 9+)
Platform ClassLoader (wcześniej Extension ClassLoader) ładuje moduły JDK, które nie należą do zestawu ładowanego przez Bootstrap (java.sql, java.xml itd.). Jego rodzicem jest bootstrap loader.
ClassLoader platform = ClassLoader.getPlatformClassLoader();
System.out.println(platform.getClass().getName());
// jdk.internal.loader.ClassLoaders$PlatformClassLoaderApplication (System) ClassLoader
Application ClassLoader ładuje klasy aplikacji ze ścieżki klas (-cp / CLASSPATH). Jego rodzicem jest Platform ClassLoader. Jest domyślnym loaderem dla kodu użytkownika.
ClassLoader app = ClassLoader.getSystemClassLoader();
System.out.println(app.getClass().getName());
// jdk.internal.loader.ClassLoaders$AppClassLoaderDelegowanie parent-first
Podczas ładowania com.example.MyService AppClassLoader najpierw prosi swojego rodzica (Platform), który następnie prosi Bootstrap. Dopiero gdy żaden z rodziców nie może załadować klasy, loader potomny próbuje załadować ją samodzielnie.
Tożsamość klas i ClassLoadery
Dwie klasy o tej samej nazwie załadowane przez różne ClassLoadery są uznawane za różne typy. Rzutowanie między nimi powoduje zgłoszenie ClassCastException — ma to istotne znaczenie w systemach wtyczek i 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!Pisanie własnego ClassLoadera
Rozszerz ClassLoader i przesłoń findClass(String name). Odczytaj kod bajtowy z niestandardowego źródła (zaszyfrowanego pliku JAR, sieci lub bazy danych), a następnie wywołaj 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: ładowanie z plików JAR
URLClassLoader ładuje klasy z listy adresów URL (ścieżek plików lub adresów HTTP). Jest przydatny w systemach wtyczek, które dodają pliki JAR w czasie działania.
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();
}Zamykanie ClassLoaderów
Po zakończeniu pracy zawsze zamykaj URLClassLoader — utrzymuje on otwarte pliki JAR. Jego zamknięcie umożliwia usunięcie lub zaktualizowanie plików JAR. Używaj try-with-resources.
Delegowanie child-first (izolowane ładowanie)
Niektóre kontenery (Tomcat, fat JAR Spring Boot) odwracają hierarchię: loader potomny próbuje załadować klasę jako pierwszy, a do rodzica odwołuje się dopiero wtedy, gdy jej nie znajdzie. Izoluje to wersje bibliotek między aplikacjami internetowymi.
Wycieki ClassLoaderów
ClassLoader jest usuwany przez GC dopiero wtedy, gdy żadna załadowana przez niego klasa nie jest osiągalna. Pola statyczne przechowujące obiekty z załadowanej klasy utrzymują loader przy życiu — to częsty wyciek podczas ponownego wdrażania aplikacji.
Szybkie sprawdzenie
Co robi ClassLoader przed próbą samodzielnego załadowania klasy?
Podsumowanie
Trzypoziomowa hierarchia: Bootstrap → Platform → Application. Delegowanie parent-first zapobiega duplikowaniu klas. Własne loadery przesłaniają findClass. Używaj URLClassLoader w systemach wtyczek. Zamykaj loadery, aby zapobiegać wyciekom.
Często zadawane pytania
Czy lekcja „Hierarchia ClassLoader i własne ładowarki” jest bezpłatna?
Tak — pełny tekst „Hierarchia ClassLoader i własne ładowarki” 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 „Hierarchia ClassLoader i własne ładowarki”?
Poznaj ładowarki klas bootstrap, platform i application oraz napisz własny ClassLoader. Ć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 2 z 4.
Ile czasu zajmuje lekcja „Hierarchia ClassLoader i własne ładowarki”?
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
- Fazy ładowania klas: Load, Link, Initialize
- Hierarchia ClassLoader i własne ładowarki
- Inspekcja kodu bajtowego za pomocą javap
- Kompilacja JIT i kompilacja warstwowa