2015-12-08 9 views

Odpowiedz

5

ClassLoader w Javie działa na trzech zasadach: delegacja, widoczność i wyjątkowość. Przekazanie zasady forward request ładowania klasy do nadrzędnego programu ładującego klasy i ładuje tylko klasę, jeśli rodzic nie jest w stanie znaleźć lub wczytać klasy. Zasada widoczności umożliwia programowi ładującemu klasy klasa główna, aby zobaczyć wszystkie klasy załadowane przez nadrzędną klasę ClassLoader, ale nadrzędny moduł ładujący klasy nie widzi klas załadowanych przez dziecko. Zasada unikalności pozwala załadować klasę dokładnie raz, co jest zasadniczo osiągane przez delegację i zapewnia, że ​​podrzędna klasa ładująca klasy nie przeładuje klasy już załadowanej przez rodzica.

Innymi słowy jak opisano here:

Ładowacze klas w Javie są zorganizowane w drzewo. Na żądanie program ładujący klasy określa, czy klasa została już załadowana w przeszłości, szukając we własnej pamięci podręcznej. Jeśli klasa jest obecna w pamięci podręcznej, CL zwraca klasę, jeśli nie, przekazuje żądanie do rodzica. Jeśli element nadrzędny nie jest ustawiony (ma wartość NULL) lub nie może załadować klasy, a klasa zgłasza wyjątek ClassNotFoundException, program ładujący próbuje załadować klasę i przeszukuje własną ścieżkę do pliku klasy. Jeśli klasa może zostać załadowana, jest zwracana, w przeciwnym razie zostanie zgłoszony wyjątek ClassNotFoundException . Wyszukiwanie w pamięci podręcznej jest rekursywnie przeprowadzane z elementu potomnego do elementu nadrzędnego , dopóki nie zostanie osiągnięty główny element drzewa lub klasa zostanie znaleziona w pamięci podręcznej. Po dojściu do katalogu głównego ładowarki klasy próbują wczytać klasę i rozłożyć rekursję z elementu nadrzędnego na potomny. Podsumowując, że mamy następującej kolejności:

  • Cache
    • nadrzędna
    • Własna

Mechanizm ten zapewnia, że ​​zajęcia z tendencją do załadowania przez ładowarki klasy najbliżej korzeń.

2

To czysta sprawa wydajności. Jeśli zapomnisz o pamięci podręcznej, kolejność ładowania klas zapewnia, że ​​klasy systemowe Java mają zawsze pierwszeństwo przed klasami aplikacji i że klasa może być ładowana tylko przez jeden moduł ładujący klasy w łańcuchu. Więc nie ma klasy, która znajduje się w więcej niż jednej pamięci podręcznej, a więc kolejność przeszukiwania pamięci podręcznych nie powoduje żadnej różnicy funkcjonalnej.

Innymi słowy, można przeszukać pamięć podręczną programu ładującego, a następnie pamięć podręczną programu ładującego klasy, a następnie pamięć podręczną programu ładującego klasy, a następnie rozpocząć próby załadowania klas, a wynik końcowy będzie dokładnie taki sam. Aby to zrobić, potrzebny jest dodatkowy interfejs API do wyszukiwania obciążonej klasy i przyniesie niewiele korzyści, ponieważ przeszukiwanie pamięci podręcznej jest bardzo szybką operacją.

Należy pamiętać, że klasy mogą być ładowane przez więcej niż jeden program ładujący klasy, ale nie, jeśli znajdują się w łańcuchu ładującym-> nadrzędnym.

Powiązane problemy