Chcę zrozumieć, jak działają moduły ładujące klasy Java. Przeczytałem kilka artykułów, ale niektóre kwestie wciąż są dla mnie niejasne.Ładowanie klasy Java
O ile rozumiem, ładowaczem pierwszej klasy jest program ładujący klasy Bootstrap (BCL). Czy jest ładowany przez maszynę JVM?
Następnie BCL ładuje bibliotekę rt.jar i program ładujący klasy Extension (ECL).
Z kolei ECL ładuje rozszerzenia i ładowanie klasy aplikacji (ACL). Lista ACL odpowiada za ładowanie całej klasy opracowanej przez użytkownika ze ścieżki klas.
Czy ten opis jest prawidłowy?
Niekilka pytań:
- Istnieje istnieje tylko jedna instancja każdego classloader w pamięci? (BCL, ECL, ACL)?
- Spojrzałem na zasadę delegacji, ale jest to dla mnie trochę niejasne. Jak to działa, załóżmy, że potrzebujemy załadować MyClass. Pierwszy jvm nadaje tej klasie nazwę ACL, a tutaj jest niejasna sprawa dla mnie, ACL przegląda ścieżkę klasy i jeśli nie ma takich delegatów klasy to praca do rodzica LUB deleguje tę pracę do rodzica zaraz po wywołaniu, mam na myśli JVM podaje nazwę klasy do ACL, nie wyszukuje tej klasy, przekazuje ją do ECL, ten CL z kolei również nie wykonuje żadnej pracy i daje ją BCL, i tylko jeśli BCL nie może znaleźć tej klasy, zwraca ją do niższej poziom (ECL) .... i tak dalej. Jaki jest prawidłowy łańcuch?
- Kiedy tworzymy niestandardowy program ładujący klasy, co jest jego rodzicielską klasą? Application ClassLoader? Czy możemy określić, na przykład ECL. O ile hierarchia klas ładujących nie jest dziedziczona, określamy rodzica w konstruktorze. Czy możemy uzyskać instancję klasy ładującej klasy ECL, aby określić ją w naszym niestandardowym CL jako obiekt nadrzędny w konstruktorze.
- Dlaczego klasy takie jak String, Object i inne nie zwracają żadnej ClassLoadder?
pokrewne: http://stackoverflow.com/questions/15250656/how-is-the-classloader-for-a-class-chosen?rq=1 –
http://javarevisited.blogspot.co .uk/2012/12/how-classloader-works-in-java.html; –