Pracując w Javie często korzystamy z dużej liczby klas. Te klasy Java nie są ładowane jednocześnie do pamięci, lecz są ładowane, gdy aplikacja tego wymaga. I tu właśnie pojawia się Java ClassLoaders. W tym artykule omówię, jak używać ClassLoadera w Javie wraz z przykładami.
przeciążenie vs nadpisanie w java
W tym artykule zostaną omówione następujące tematy:
- Co to jest ClassLoader?
- Typy ClassLoader
- Zasady ClassLoader
- Metody ClassLoader
- Niestandardowy ClassLoader
Zaczynajmy!
Co to jest ClassLoader w Javie?
Klasa ClassLoader w języku Java jest wywoływana przez środowisko wykonawcze Java w celu dynamicznego ładowania klas, gdy jest to wymagane przez aplikację w Maszyna wirtualna Java . Ponieważ ClassLoaders są częścią środowiska Java Runtime Environment, wirtualna maszyna języka Java nie będzie miała pojęcia o bazowych plikach i systemach plików.
Przyjrzyjmy się teraz różnym typom wbudowanych programów ClassLoaders w Javie.
Typy ClassLoadera w Javie
Różne typy ClassLoaderów w Javie są następujące:
Omówmy każdy z nich jeden po drugim.
Rozszerzenie ClassLoader
Jak sugeruje nazwa, rozszerzenie ClassLoader ładuje rozszerzenia podstawowych klas Java z pliku JDK Biblioteka rozszerzeń. Jest elementem podrzędnym Bootstrap ClassLoader i ładuje rozszerzenia z katalogu JRE / lib / text lub dowolnego innego katalogu określonego we właściwości systemowej java.ext.dirs.
Aplikacja lub system ClassLoader
Aplikacja lub system ClassLoader jest elementem podrzędnym rozszerzenia ClassLoader. Ten typ ClassLoader ładuje wszystkie klasy poziomu aplikacji znajdujące się w opcji wiersza polecenia -cp lub w zmiennej środowiskowej CLASSPATH.
Bootstrap ClassLoader
Jak wszyscy to wiemy Klasy Java są ładowane przez instancję java.lang.ClassLoade. Ponieważ jednak ClassLoader są klasami, Bootstrap ClassLoader jest odpowiedzialny za ładowanie wewnętrznych klas JDK. BootStrap ClassLoader to kod maszynowy, który uruchamia operację, gdy JVM go wywołuje i ładuje klasy z rt.jar. Można więc zrozumieć, że usługa Bootstrap ClassLoader nie ma elementu nadrzędnego ClassLoader i dlatego jest znana jako Primordial ClassLoader.
Uwaga: Priorytet Bootstrap jest wyższy niż Extension, a priorytet nadany Extension ClassLoader jest wyższy niż Application ClassLoader. Zobacz obrazek poniżej:
W dalszej części tego artykułu przyjrzyjmy się zasadom działania ClassLoader.
Zasady ClassLoadera w Javie
Zbiór reguł, na podstawie których działa Java ClassLoader, to następujące trzy zasady:
Zrozummy każdy z nich.
Wyjątkowość własności
Ta właściwość zapewnia, że nie ma powtórzeń klas, a wszystkie klasy są unikalne. Właściwość unikalności zapewnia również, że klasy są ładowane przez element nadrzędny ClassLoader, nie są ładowane przez element podrzędny ClassLoader. W scenariuszu, w którym nadrzędna klasa ClassLoader nie może znaleźć klasy, bieżąca instancja spróbuje to zrobić samodzielnie.
Model delegacji
ClassLoader w Javie działa w oparciu o zestaw operacji podany przez Model Delegacji. Tak więc za każdym razem, gdy generowane jest żądanie znalezienia klasy lub zasobu, instancja ClassLoader deleguje wyszukiwanie tej klasy lub zasobu do nadrzędnego ClassLoader.
Zestaw operacji, na podstawie których działa ClassLoader, przedstawia się następująco:
- Wirtualna maszyna języka Java sprawdza, czy klasa jest załadowana, czy nie, za każdym razem, gdy napotka klasę.
- W przypadku, gdy klasa jest załadowana JVM kontynuuje wykonanie klasy, ale w scenariuszu, w którym klasa nie jest załadowana, wtedyJVM prosi podsystem Java ClassLoader o załadowanie tej konkretnej klasy. Następnie podsystem ClassLoader przekazuje kontrolę do Application ClassLoader.
- Następnie Application ClassLoader deleguje żądanie do rozszerzenia ClassLoader, które następnie przekazuje żądanie do modułu Bootstrap ClassLoader.
- Teraz Bootstrap ClassLoader wyszukuje wUruchom ścieżkę klasy, aby sprawdzić, czy klasa jest dostępna, czy nie. Jeśli klasa jest dostępna, jest ładowana, w przeciwnym razie żądanie jest ponownie przesyłane do rozszerzenia ClassLoader.
- Rozszerzenie ClassLoader sprawdza klasę w ścieżce klas rozszerzenia.Jeśli klasa jest dostępna, jest ładowana, w przeciwnym razie żądanie jest ponownie przesyłane do Application ClassLoader.
- Na koniec Application ClassLoader wyszukuje klasę w ścieżce klas aplikacji.Jeśli klasa jest dostępna, zostanie załadowana, w przeciwnym razie zobaczysz wyjątek ClassNotFoundException.
Zobacz obrazek poniżej.
Zasada widoczności
Zgodnie z tą zasadą klasy podrzędne są widoczne dla klas załadowanych przez ich klasy nadrzędne ClassLoaders, ale odwrotnie nie jest prawdą. Zatem klasy ładowane przez Application ClassLoader mają wgląd w klasy ładowane przez Extension i Bootstrap ClassLoader.
Na przykład, jeśli mamy dwie klasy: A i B, załóżmy, że klasa A jest ładowana przez Application ClassLoader, a klasa B jest ładowana przez Extensions ClassLoader. W tym przypadku klasy A i B są widoczne dla wszystkich klas załadowanych przez Application ClassLoader, ale klasa B jest widoczna tylko dla tych klas załadowanych przez rozszerzenie ClassLoader.
Ponadto, jeśli spróbujesz załadować te klasy za pomocą Bootstrap ClassLoader, zobaczysz plik java.lang.ClassNotFoundException . wyjątek.
W porządku, teraz, gdy znasz już typy ClassLoaderów i stojące za nimi zasady, przyjrzyjmy się kilku ważnym metodomz java.lang.ClassLoader klasa.
Metody ClassLoader w Javie
Niewiele niezbędnych ClassLoader są następujące:
- loadClass (nazwa ciągu, rozwiązanie logiczne)
- defineClass ()
- findClass (nazwa ciągu)
- Class.forName (nazwa ciągu, inicjalizacja wartości logicznej, moduł ładujący ClassLoader)
- getParent ()
- getResource ()
loadClass (nazwa ciągu, rozwiązanie logiczne)
Ta metoda jest punktem wejścia klasy ClassLoader i służy do ładowania klasy, do której odwołuje się maszyna JVM. Przyjmuje nazwę jako parametr. Maszyna JVM wywołuje metodę loadClass () w celu rozwiązania odwołań do klas przez ustawienie wartości logicznej na true. Tylko jeśli musimy określić, czy klasa istnieje, czy nie, parametr boolowski jest ustawiany na false.
Deklaracja:
public Class loadClass (nazwa ciągu, rozwiązanie logiczne) zgłasza ClassNotFoundException {
defineClass ()
Ostatnia metoda używana do definiowania tablicy bajtów jako instancji klasy. W przypadku, gdy klasa jest nieprawidłowa, zgłasza ClassFormatError.
Deklaracja:
protected final Class defineClass (nazwa ciągu, bajt [] b, int off, int len) zgłasza ClassFormatError
findClass (nazwa ciągu)
Do znalezienia określonej klasy używana jest metoda findClass. Tak więc po prostu znajduje klasę z w pełni kwalifikowaną nazwą jako parametr, ale nie ładuje klasy. Metoda loadClass () wywołuje tę metodę, jeśli nadrzędna klasa ClassLoader nie może znaleźć żądanej klasy. Ponadto, jeśli żaden element nadrzędny ClassLoader nie znajdzie klasy, domyślna implementacja wyrzuca plik Klasa nie znaleziono wyjątku.
Deklaracja:
protected Class findClass (String name) zgłasza wyjątek ClassNotFoundException
Class.forName (nazwa ciągu, inicjalizacja wartości logicznej, moduł ładujący ClassLoader)
Ta metoda służy do ładowania i inicjowania klasy. Daje opcję wyboru któregokolwiek z ClassLoaderów i gdy parametr ClassLoader ma wartość NULL, a następnie automatycznie używany jest Bootstrap ClassLoader.
Deklaracja:
publiczna statyczna klasa forName (nazwa ciągu, inicjalizacja wartości logicznej, moduł ładujący ClassLoader) zgłasza wyjątek ClassNotFoundException
getParent ()
Metoda getParent służy do zwracania elementu nadrzędnego ClassLoader w celu delegowania.
Deklaracja:
public final ClassLoader getParent ()
getResource ()
Jak sama nazwa wskazuje, metoda getResource () próbowała znaleźć zasób o podanej nazwie. Najpierw deleguje żądanie do nadrzędnego ClassLoader dla zasobu. W przypadku, gdy rodzic ma wartość null, przeszukiwana jest ścieżka ClassLoader wbudowana w maszynę JVM. Jeśli to się nie powiedzie, metoda wywoła metodę findResource (String) w celu znalezienia zasobu, w którym nazwa zasobu jest określona jako dane wejściowe, które mogą być bezwzględną lub względną ścieżką klasy. Następnie zwraca obiekt URL do odczytu zasobu lub zwraca wartość null, jeśli zasób nie ma odpowiednich uprawnień do zwrócenia zasobu lub nie został znaleziony.
Deklaracja:
publiczny adres URL getResource (nazwa ciągu)
Następnie w tym artykule na temat ClassLoader w Javie, pozwól nam zrozumieć Custom ClassLoader.
Niestandardowy ClassLoader w Javie
Wbudowane ClassLoadery zajmą się większością przypadków, w których pliki są już w systemie plików, ale jeśli chcesz załadować klasy z lokalnego dysku twardego, musisz skorzystać z niestandardowych ClassLoaderów.
Utwórz niestandardowy ClassLoader
Aby utworzyć niestandardowy ClassLoader, musisz rozszerzyć ClassLoader klasę i nadpisz findClass () metoda:
Przykład: Stwórzmy niestandardowy ClassLoader, który rozszerza domyślny ClassLoader i ładuje tablicę bajtów z określonego pliku. Zobacz poniższy kod.
pakiet edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream publiczna klasa Przykład rozszerza ClassLoader {@Override public Class findClass (String samplename) rzuca ClassNotFoundException {bajt [] b = customLoadClassFrom (nazwa_sampl) return defineClass (nazwa_sampli, b, 0, b.length)} bajt prywatny [] customLoadClassFromFile (String nazwa_demofilu) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (nazwa demofilu.replace ('.', File. separatorChar) + '.class') byte [] buffer ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () return buffer}}
Tym samym kończymy ten artykuł o ClassLoader w Javie. Mam nadzieję, że zrozumiałeś, czym są ClassLoadery w Javie, jego metody, różne typy ClassLoaderów itp.
Jeśli znalazłeś ten artykuł na temat „ClassLoader w Javie”, zapoznaj się z autorstwa Edureka, zaufanej firmy zajmującej się edukacją online, z siecią ponad 250 000 zadowolonych uczniów rozsianych po całym świecie. Jesteśmy tutaj, aby pomóc Ci na każdym etapie Twojej podróży, aby zostać oprócz pytań do rozmowy kwalifikacyjnej w języku Java, opracowaliśmy program nauczania, który jest przeznaczony dla studentów i profesjonalistów, którzy chcą być Jawa Deweloper.
Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy w tym artykule „ClassLoader w Javie ' a my skontaktujemy się z Tobą tak szybko, jak to możliwe.