Mikä on ClassLoader-rooli Java-ohjelmassa?



Tämä artikkeli on kattava opas siitä, miten ClassLoader toimii Javassa. Siinä käsitellään Java-luokan ClassLoaderin tyyppejä, periaatteita ja menetelmiä.

Työskentelemällä Javalla käytämme usein paljon luokkia. Näitä Java-luokkia ei ladata kerralla muistiin, vaan ne ladataan, kun sovellus sitä vaatii. Täällä Java ClassLoaders tulee kuvaan. Joten tässä artikkelissa keskustelen siitä, miten ClassLoaderia käytetään Java-ohjelmassa, yhdessä esimerkkien kanssa.

Tässä artikkelissa käsitellään seuraavia aiheita:





  1. Mikä on ClassLoader?
  2. ClassLoader-tyypit
  3. ClassLoaderin periaatteet
  4. ClassLoader-menetelmät
  5. Mukautettu ClassLoader

Anna meidän aloittaa!

Mikä on Java-luokan ClassLoader?

Java Runtime Environment kutsuu Java-luokan ClassLoaderia lataamaan luokat dynaamisesti aina, kun sovellus sitä vaatii. Java-virtuaalikone . Koska ClassLoaders on osa Java Runtime Environment -ympäristöä, Java-virtuaalikoneella ei ole aavistustakaan taustalla olevista tiedostoista ja tiedostojärjestelmistä.



Anna nyt ymmärtää Java-tyyppisten sisäänrakennettujen ClassLoaderien tyypit.

Java-luokan ClassLoader-tyypit

Java-luokan ClassLoaders-tyypit ovat seuraavat:

Keskustelkaamme niistä kukin yksi kerrallaan.



Laajennus ClassLoader

Kuten nimestä voi päätellä, Extension ClassLoader lataa Java-ydinluokkien laajennukset JDK Laajennuskirjasto. Se on Bootstrap ClassLoaderin alataso ja lataa laajennukset JRE / lib / text-hakemistosta tai mistä tahansa muusta java.ext.dirs-järjestelmäominaisuudessa määritetystä hakemistosta.

Sovellus tai System ClassLoader

Sovellus tai System ClassLoader on Extension ClassLoaderin alataso. Tämäntyyppinen ClassLoader lataa kaikki sovellustasotasot, jotka löytyvät komentorivivalinnasta -cp tai ympäristömuuttujasta CLASSPATH.

Bootstrap ClassLoader

Kuten me kaikki tiedämme sen Java-luokat ladataan instanssilla java.lang.ClassLoade. Mutta koska ClassLoaders ovat luokkia, Bootstrap ClassLoader on vastuussa JDK: n sisäisten luokkien lataamisesta. BootStrap ClassLoader on konekoodi, joka käynnistää toiminnon, kun JVM kutsuu sitä ja lataa luokat rt.jar-tiedostosta. Joten voit ymmärtää, että Bootstrap ClassLoader -palvelimella ei ole vanhempaa ClassLoader-sovellusta ja se tunnetaan siten nimellä Primordial ClassLoader.

Huomautus: Bootstrapin prioriteetti on korkeampi kuin Extension, ja Extension ClassLoaderille annettu prioriteetti on korkeampi kuin Application ClassLoader. Katso alla oleva kuva:

ClassLoader-tyypit - ClassLoader Java-sovelluksessa - Edureka

Seuraavaksi tässä artikkelissa ymmärretään periaatteet, joiden perusteella ClassLoader toimii.

ClassLoaderin periaatteet Java-ohjelmassa

Sääntöjoukko, johon Java ClassLoader toimii, ovat seuraavat kolme periaatetta:

Ymmärretään kukin niistä.

Ainutlaatuisuusominaisuus

Tämä ominaisuus varmistaa, että luokkia ei toisteta ja että kaikki luokat ovat ainutlaatuisia. Ainutlaatuisuusominaisuus varmistaa myös, että yläluokka ClassLoader ei lataa luokkia. Skenaariossa, jossa vanhempi ClassLoader ei löydä luokkaa, nykyinen ilmentymä yrittää tehdä sen itse.

Edustamismalli

ClassLoader Java-sovelluksessa toimii delegointimallin antamien toimintojen perusteella. Joten aina kun luodaan pyyntö luokan tai resurssin löytämiseksi, ClassLoader-ilmentymä delegoi luokan tai resurssin haun vanhemmalle ClassLoaderille.

Seuraavat toiminnot, joihin ClassLoader toimii, ovat seuraavat:

  • Java-virtuaalikone tarkistaa, onko luokka ladattu vai ei, aina kun se kohtaa luokan.
  • Siinä tapauksessa, että luokka ladataan JVM jatkuu luokan suorituksella, mutta tilanteessa, jossa luokkaa ei ole ladattu, niinJVM pyytää Java ClassLoader -alijärjestelmää lataamaan kyseisen luokan. Sen jälkeen ClassLoader-alijärjestelmä antaa hallinnan Application ClassLoaderille.
  • Sen jälkeen Application ClassLoader siirtää pyynnön Extension ClassLoaderille, joka tämän jälkeen välittää pyynnön Bootstrap ClassLoaderille.
  • Nyt Bootstrap ClassLoader hakeeBootstrap classpath tarkistaa, onko luokka käytettävissä vai ei. Jos luokka on käytettävissä, se ladataan, muuten pyyntö välitetään jälleen Extension ClassLoaderille.
  • Extension ClassLoader tarkistaa luokan laajennuksen polulla.Jos luokka on käytettävissä, se ladataan, muuten pyyntö välitetään uudelleen Application ClassLoaderille.
  • Lopuksi Application ClassLoader etsii luokkaa sovelluksen luokkaradalta.Jos luokka on käytettävissä, ladataan, muuten näet poikkeuksen ClassNotFoundExceptionista.

Katso alla olevaa kuvaa.

Näkyvyyden periaate

Tämän periaatteen mukaan lasten luokat näkyvät vanhempien ClassLoadersin lataamille luokille, mutta päinvastoin ei ole totta. Joten Application ClassLoader -sovelluksen lataamilla luokilla on näkyvyys Extension- ja Bootstrap ClassLoader -laitteiden lataamiin luokkiin.

Esimerkiksi, jos meillä on kaksi luokkaa: A ja B, oletetaan, että luokka A on ladattu Application ClassLoaderilla ja luokka B on Extensions ClassLoader. Täällä luokat A ja B näkyvät kaikille niille luokille, jotka Application ClassLoader on ladannut, mutta luokka B näkyy vain niille luokille, jotka Extension ClassLoader on ladannut.

Lisäksi, jos yrität ladata nämä luokat Bootstrap ClassLoaderilla, näet java.lang.ClassNotFoundException . poikkeus.

Selvä, nyt kun tiedät ClassLoader-tyypit ja sen taustalla olevat periaatteet, tarkastellaan muutamia tärkeitä menetelmiäalkaen java.lang.ClassLoader luokassa.

Menetelmät ClassLoaderissa Javassa

Harvat välttämättömät ClassLoader ovat seuraavat:

loadClass (Merkkijonon nimi, looginen resoluutio)

Tämä menetelmä on ClassLoader-aloituskohta ja sitä käytetään JVM: n viittaaman luokan lataamiseen. Se vie nimen parametrina. JVM käyttää loadClass () -menetelmää ratkaistakseen luokaviitteet asettamalla loogisen arvon tosi-arvoksi. Vain jos meidän on määritettävä, onko luokka olemassa vai ei, looginen parametri asetetaan epätosi.

Vakuutus:

public Class loadClass (merkkijonon nimi, totuusarvoinen ratkaisu) heittää ClassNotFoundException {

defineClass ()

Viimeinen menetelmä, jota käytetään tavujärjestelmän määrittelemiseen luokan esiintymänä. Jos luokka on virheellinen, se heittää ClassFormatError-arvon.

Vakuutus:

suojattu lopullinen Class defineClass (merkkijonon nimi, tavu [] b, int pois, int len) heittää ClassFormatError

findClass (merkkijono)

FindClass-menetelmää käytetään määritetyn luokan löytämiseen. Joten se vain löytää luokan, jolla on täysin pätevä nimi parametrina, mutta ei lataa luokkaa. LoadClass () -menetelmä kutsuu tätä menetelmää, jos ylätason ClassLoader ei löydä pyydettyä luokkaa. Lisäksi, jos yksikään ClassLoaderin vanhemmista ei löydä luokkaa, oletusarvoinen toteutus heittää a ClassNotFoundException.

mikä on skanneri java

Vakuutus:

suojattu Class findClass (merkkijono) heittää ClassNotFoundExceptionin

Class.forName (Merkkijonon nimi, looginen alustus, ClassLoader-latausohjelma)

Tätä menetelmää käytetään luokan lataamiseen ja alustamiseen. Se antaa mahdollisuuden valita mikä tahansa ClassLoaderista ja lisätä ClassLoader-parametri NULL-arvoksi, sitten käytetään automaattisesti Bootstrap ClassLoaderia.

Vakuutus:

public staattinen Class forName (merkkijonon nimi, looginen alustus, ClassLoader-latausohjelma) heittää ClassNotFoundException

getParent ()

GetParent-menetelmää käytetään palauttamaan ylätason ClassLoader delegointiin.

Vakuutus:

julkinen lopullinen ClassLoader getParent ()

getResource ()

Kuten nimestä voi päätellä, getResource () -menetelmä yritti löytää resurssin, jolla oli etunimi. Aluksi se siirtää pyynnön resurssin vanhemmalle ClassLoaderille. Jos vanhempi on tyhjä, etsitään JVM: ään sisäänrakennetun ClassLoader-polkua. Jos tämä epäonnistuu, menetelmä kutsuu findResource (String) -resurssin etsimään resurssia, jossa resurssin nimi määritetään syötteeksi, joka voi olla joko absoluuttinen tai suhteellinen luokkatie. Sitten se palauttaa URL-objektin resurssin lukemista varten tai palauttaa nolla-arvon, jos resurssilla ei ole riittäviä oikeuksia palauttaa resurssia tai sitä ei löydy.

Vakuutus:

public URL getResource (merkkijono)

Seuraavaksi ymmärrämme tässä Java-luokan ClassLoader-artikkelissa mukautettua ClassLoaderia.

Mukautettu ClassLoader Java-sovelluksessa

Sisäänrakennetut ClassLoaders huolehtivat suurimmasta osasta tapauksia, joissa tiedostot ovat jo tiedostojärjestelmässä, mutta jos haluat ladata luokat paikalliselta kiintolevyltä, sinun on käytettävä mukautettuja ClassLoaders-sovelluksia.

Luo mukautettu ClassLoader

Voit luoda mukautetun ClassLoader-sovelluksen laajentamalla ClassLoader luokan ja ohittaa findClass () menetelmä:

Esimerkki: Luodaan mukautettu ClassLoader, joka laajentaa oletusarvoista ClassLoader-ohjelmaa ja lataa tavutaulukon määritetystä tiedostosta. Katso alla oleva koodi.

paketti edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class Sample Extends ClassLoader {@Override public Class findClass (String samplename) heittää ClassNotFoundException {tavu [] b = customLoad (samplename) return defineClass (samplename, b, 0, b.pituus)} yksityinen tavu [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', separatorChar) + '.class') tavu [] puskuri ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} puskuri = bStream.toByteArray () palautuspuskuri}}

Tämän avulla olemme päättäneet tämän artikkelin Java-luokan ClassLoaderista. Toivon, että ymmärrät, mitä ovat Java-luokan ClassLoaders, sen menetelmät, erityyppiset ClassLoader-laitteet jne.

Jos löysit tämän artikkelin aiheesta ”ClassLoader in Java”, tutustu Edureka, luotettava verkko-oppimisyritys, jolla on yli 250 000 tyytyväisen oppijan verkosto, joka levisi ympäri maailmaa. Olemme täällä auttaaksemme sinua matkasi jokaisessa vaiheessa, jotta tulemme tämän java-haastattelukysymyksen lisäksi, keksimme opetussuunnitelman, joka on tarkoitettu opiskelijoille ja ammattilaisille, jotka haluavat olla Java Kehittäjä.

Onko sinulla kysymys meille? Mainitse se tämän “ClassLoader in Java.” -Kommenttiosassa ' ja otamme sinuun yhteyttä mahdollisimman pian.