2015-02-02 14 views
6

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?

Nie

kilka pytań:

  1. Istnieje istnieje tylko jedna instancja każdego classloader w pamięci? (BCL, ECL, ACL)?
  2. 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?
  3. 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.
  4. Dlaczego klasy takie jak String, Object i inne nie zwracają żadnej ClassLoadder?
+0

pokrewne: http://stackoverflow.com/questions/15250656/how-is-the-classloader-for-a-class-chosen?rq=1 –

+0

http://javarevisited.blogspot.co .uk/2012/12/how-classloader-works-in-java.html; –

Odpowiedz

5

Odpowiedzi:

  1. O ile mi zrozumieć pierwsza ładowarka klasa jest klasą ładowarka Bootstrap (PLC). Czy jest ładowany przez JVM?

    Nie jest to jednoznacznie zdefiniowane, ale najprawdopodobniej zostanie zapisane w natywnym kodzie.

  2. Następnie BCL ładuje bibliotekę rt.jar i program ładujący klasy Extension (ECL).

    Tak, to załaduje plik rt.jar (do wersji Java 8, jak w Javie 9, pojawi się nowy system modułów). To, czy ładuje ECL czy nie, nie jest jednoznacznie zdefiniowane.

  3. 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.

    Tak ładuje rozszerzenia i czy ładuje listę ACL lub nie jest jawnie zdefiniowana. ACL w rzeczywistości ładuje wpisy typu classpath.

  4. Istnieje tylko jedna instancja każdego programu ładującego klasy w pamięci? (BCL, ECL, ACL)?

    Tak, to prawda. Ponieważ tożsamość klasy jest zdefiniowana jako para FQCN i jej efektywny moduł ładujący klasy, w przeciwnym razie nie będzie działać.

  5. Przyjrzałem się zasadzie delegacji, ale jest dla mnie 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?

    W standardzie Java, istnieje nadrzędny pierwszy delegacja modelu, co oznacza classloader najpierw zapytać jego rodziców, a dopiero potem będzie próbował załadować klasę samą w sobie.

  6. 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.

    Domyślnym elementem nadrzędnym niestandardowego programu ładującego klasy jest moduł ładujący klasy aplikacji.

    Pytanie brzmi, dlaczego musiałbyś to zrobić? Jest mało prawdopodobne, aby twój program zachowywał się poprawnie. Formalnie możesz to zrobić przez YourClass.class.getClassLoader().getParent().

  7. Dlaczego klasy takie jak String, Object i inne nie zwracają żadnej ClassLoadder?

    bootstrap ClassLoader jest reprezentowane null w API.