Koja je uloga ClassLoader-a u Javi?



Ovaj je članak sveobuhvatan vodič o tome kako ClassLoader radi na Javi. Raspravlja o vrstama, principima i metodama ClassLoader-a u Javi.

Dok radimo u Javi, često koristimo velik broj predavanja. Ove se Java klase ne učitavaju odjednom u memoriju, već se učitavaju kada to zahtijeva aplikacija. Tu se pojavljuju Java ClassLoaders. Tako ću u ovom članku raspravljati o tome kako koristiti ClassLoader u Javi zajedno s primjerima.

Sljedeće teme bit će obrađene u ovom članku:





  1. Što je ClassLoader?
  2. Vrste ClassLoader
  3. Principi ClassLoader-a
  4. Metode ClassLoader
  5. Prilagođeni ClassLoader

Krenimo!

java novi datum iz niza

Što je ClassLoader u Javi?

ClassLoader u Javi poziva Java Runtime Environment za dinamičko učitavanje klasa kad god to zahtijeva aplikacija u Java virtualni stroj . Budući da su ClassLoaders dio Java Runtime Environment-a, Java Virtual Machine neće imati pojma o temeljnim datotekama i datotečnim sustavima.



Razumijemo sada različite vrste ugrađenih ClassLoaders-a u Javi.

Vrste ClassLoader u Javi

Različite vrste ClassLoaders u Javi su kako slijedi:

Razgovarajmo o svakom od njih jedan po jedan.



Proširenje ClassLoader

Kao što i samo ime govori, Extension ClassLoader učitava proširenja osnovne Java klase iz JDK Proširenje knjižnica. Podređeno je Bootstrap ClassLoaderu i učitava proširenja iz direktorija JRE / lib / text ili bilo kojeg drugog direktorija navedenog u svojstvu sustava java.ext.dirs.

Aplikacija ili sustav ClassLoader

Aplikacija ili System ClassLoader podređena je proširenju ClassLoader. Ova vrsta ClassLoader učitava sve klase na razini aplikacije pronađene u opciji naredbenog retka -cp ili u varijabli okoline CLASSPATH.

Bootstrap ClassLoader

Kao što to svi znamo Java satovi učitava instanca java.lang.ClassLoade. No, budući da su ClassLoaders klase, Bootstrap ClassLoader odgovoran je za učitavanje JDK internih klasa. BootStrap ClassLoader strojni je kôd koji započinje operaciju kad je JVM pozove i učitava klase iz rt.jar. Dakle, možete razumjeti da usluga Bootstrap ClassLoader nema roditeljski ClassLoader i stoga je poznata kao Primordial ClassLoader.

Bilješka: Prioritet Bootstrapa veći je od Extension, a prioritet koji daje Extension ClassLoader veći od Application ClassLoader. Pogledajte sliku u nastavku:

Vrste ClassLoader - ClassLoader na Javi - Edureka

Sljedeće u ovom članku, shvatimo principe na kojima ClassLoader radi.

Principi ClassLoader-a u Javi

Skup pravila na temelju kojih Java ClassLoader radi su sljedeća tri principa:

Razumijemo svakog od njih.

Svojstvo jedinstvenosti

Ovo svojstvo osigurava da nema ponavljanja klasa i da su sve klase jedinstvene. Svojstvo jedinstvenosti također osigurava da klase učitava nadređeni ClassLoader, a ne učitava podređeni ClassLoader. U scenariju, kada nadređeni ClassLoader ne može pronaći klasu, tada će trenutna instanca to pokušati učiniti sama.

koja metoda klase skenera čita niz

Model delegiranja

ClassLoader u Javi radi na temelju skupa operacija danih modelom delegiranja. Dakle, kad god se generira zahtjev za pronalaženje klase ili resursa, tada će instanca ClassLoader delegirati pretraživanje klase ili resursa nadređenom ClassLoaderu.

Skup operacija na temelju kojih ClassLoader radi je sljedeći:

  • Java virtualni stroj provjerava je li klasa učitana ili ne, kad god naiđe na klasu.
  • U slučaju kada je učitana klasa JVM nastavlja s izvršavanjem klase, ali u slučaju kada klasa nije učitana, ondaJVM traži od podsustava Java ClassLoader da učita tu određenu klasu. Nakon toga, podsistem ClassLoader daje kontrolu aplikaciji ClassLoader.
  • Aplikacija ClassLoader zatim delegira zahtjev Proširenju ClassLoader, koja nakon toga prosljeđuje zahtjev Bootstrap ClassLoaderu.
  • Sada Bootstrap ClassLoader pretražuje uBootstrap put do klase da provjeri je li klasa dostupna ili ne. Ako je klasa dostupna, tada se učitava, inače se zahtjev ponovo prosljeđuje Extension ClassLoaderu.
  • Ekstenzija ClassLoader provjerava klasu u putu klase ekstenzije.Ako je klasa dostupna, tada se učitava, inače se zahtjev ponovno prosljeđuje Application ClassLoaderu.
  • Konačno, Application ClassLoader traži klasu u stazi aplikacije.Ako je klasa dostupna, tada je učitana, inače ćete vidjeti iznimku ClassNotFoundException.

Pogledajte sliku u nastavku.

Načelo vidljivosti

Prema ovom principu, dječji su razredi vidljivi razredima koje učitavaju njezini nadređeni ClassLoaders, ali obrnuto nije istina. Dakle, klase učitane aplikacijskim ClassLoader imaju vidljivost u klase učitane Extension i Bootstrap ClassLoader.

Na primjer, ako imamo dvije klase: A & B, pretpostavimo da klasu A učitava Application ClassLoader, a klasu B proširenja ClassLoader. Ovdje su klase A i B vidljive svim onim klasama koje učitava Application ClassLoader, ali klasa B vidljiva je samo onim klasama koje učitava Extension ClassLoader.

Također, ako pokušate učitati ove klase pomoću Bootstrap ClassLoader, vidjet ćete java.lang.ClassNotFoundException . iznimka.

Dobro, sad kad znate vrste ClassLoaders-a i principe koji stoje iza toga, pogledajmo nekoliko važnih metodaod java.lang.ClassLoader razred.

Metode ClassLoader-a u Javi

Nekoliko bitnih ClassLoader su kako slijedi:

loadClass (Ime niza, logičko rješavanje)

Ova metoda je ulazna točka ClassLoader-a i koristi se za učitavanje klase na koju se poziva JVM. Potrebno je ime kao parametar. JVM poziva metodu loadClass () da razriješi reference klase postavljanjem logičke vrijednosti na true. Samo ako moramo utvrditi postoji li klasa ili ne, logički parametar postavlja se na false.

Izjava:

javna klasa loadClass (naziv niza, logičko rješenje) baca ClassNotFoundException {

defineClass ()

Konačna metoda koja se koristi za definiranje niza bajtova kao instance klase. U slučaju da je tada klasa nevaljana, ona baca ClassFormatError.

Izjava:

zaštićena konačna klasa defineClass (naziv niza, bajt [] b, int isključen, int len) baca ClassFormatError

findClass (naziv niza)

Za pronalaženje navedene klase koristi se metoda findClass. Dakle, samo pronalazi klasu s potpuno kvalificiranim imenom kao parametar, ali ne učitava klasu. Način loadClass () poziva ovu metodu ako nadređeni ClassLoader ne može pronaći traženu klasu. Također, ako niti jedan roditelj ClassLoader ne pronađe klasu, zadana implementacija baca a ClassNotFoundException.

Izjava:

zaštićena klasa findClass (naziv niza) baca ClassNotFoundException

Class.forName (Ime niza, logička inicijalizacija, učitavač ClassLoader)

Ova se metoda koristi za učitavanje i inicijalizaciju klase. Daje mogućnost odabira bilo kojeg od ClassLoaders i ako je parametar ClassLoader NULL, tada se automatski koristi Bootstrap ClassLoader.

Izjava:

javna statička klasa forName (naziv niza, logička inicijalizacija, učitavač ClassLoader) baca ClassNotFoundException

getParent ()

Metoda getParent koristi se za vraćanje nadređenog ClassLoader-a na delegiranje.

Izjava:

javni konačni ClassLoader getParent ()

getResource ()

Kao što i samo ime govori, metoda getResource () pokušala je pronaći resurs s danim imenom. U početku će delegirati zahtjev nadređenom ClassLoaderu za resurs. U slučaju da je roditelj null, tada se traži put ClassLoader ugrađenog u JVM. Ako to ne uspije, tada će metoda pozvati findResource (String) kako bi pronašla resurs, gdje je naziv resursa naveden kao ulaz koji može biti apsolutni ili relativni put klase. Zatim vraća URL objekt za čitanje resursa ili vraća null vrijednost ako resurs nema odgovarajuće privilegije za vraćanje resursa ili ako nije pronađen.

Izjava:

javni URL getResource (naziv niza)

Sljedeće, u ovom članku o ClassLoaderu na Javi, razjasnimo Custom ClassLoader.

Prilagođeni ClassLoader u Javi

Ugrađeni ClassLoaders pobrinut će se za većinu slučajeva kada su datoteke već u datotečnom sustavu, ali ako želite učiti klase s lokalnog tvrdog diska, tada morate koristiti prilagođene ClassLoaders.

Izradite prilagođeni ClassLoader

Da biste stvorili prilagođeni ClassLoader, morate proširiti ClassLoader klase i nadjačati findClass () metoda:

Primjer: Stvorimo prilagođeni ClassLoader koji proširuje zadani ClassLoader i učitava bajtni niz iz navedene datoteke. Pogledajte donji kod.

paket edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class Uzorak proširuje ClassLoader {@Override public Class findClass (string samplename) baca ClassNotFoundException {byte [] (samplename) return defineClass (samplename, b, 0, b.length)} privatni bajt [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofile.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}}

Ovime smo završili ovaj članak o ClassLoaderu na Javi. Nadam se da ste razumjeli što su ClassLoaders u Javi, njegove metode, različite vrste ClassLoaders itd.

Ako ste pronašli ovaj članak o 'ClassLoader u Javi', pogledajte Edureka, pouzdana tvrtka za internetsko učenje s mrežom od više od 250 000 zadovoljnih učenika raširenih širom svijeta. Ovdje smo da vam pomognemo u svakom koraku na putovanju, jer osim što postajete pitanja za ovaj intervju za javu, donosimo kurikulum koji je dizajniran za studente i profesionalce koji žele biti Java Programer.

koja je razlika između preopterećenja i premošćivanja

Imate pitanje za nas? Molimo navedite ga u odjeljku za komentare ovog 'ClassLoader-a na Javi ' i javit ćemo vam se u najkraćem mogućem roku.