Milline on Java-s ClassLoaderi roll?



See artikkel on põhjalik juhend, kuidas ClassLoader Java-s töötab. Selles käsitletakse Java-s ClassLoaderi tüüpe, põhimõtteid ja meetodeid.

Javas töötades kasutame sageli suurt hulka klasse. Neid Java-klasse ei laadita korraga mällu, vaid need laaditakse, kui rakendus seda nõuab. Siin tulevad pildile Java ClassLoaderid. Nii et selles artiklis käsitlen ma koos ClassLoaderi kasutamist Javas koos näidetega.

Selles artiklis käsitletakse järgmisi teemasid:





  1. Mis on ClassLoader?
  2. ClassLoaderi tüübid
  3. ClassLoaderi põhimõtted
  4. ClassLoaderi meetodid
  5. Kohandatud ClassLoader

Alustagem!

Mis on Java-s ClassLoader?

Java Runtime Environment kutsub Java-i ClassLoaderit klasside dünaamiliseks laadimiseks alati, kui rakendus seda nõuab Java virtuaalne masin . Kuna ClassLoaders on Java Runtime Environmenti osa, pole Java virtuaalsel masinal aimu failide ja failisüsteemide kohta.



Nüüd mõistame Java sisseehitatud ClassLoaderite erinevaid tüüpe.

ClassLoaderi tüübid Java-s

Java-tüüpi ClassLoaderite erinevad tüübid on järgmised:

Arutagem neist igaüks ükshaaval.



Laiendus ClassLoader

Nagu nimigi ütleb, laadib ClassLoader Java põhiklasside laiendused JDK Laiendusraamatukogu. See on Bootstrap ClassLoaderi laps ja laadib laiendused kataloogist JRE / lib / text või mis tahes muust kataloogist, mis on määratud süsteemi atribuudis java.ext.dirs.

Rakendus või System ClassLoader

Rakendus või System ClassLoader on Extension ClassLoaderi laps. Seda tüüpi ClassLoader laadib kõik rakendustaseme klassid, mis on leitud käsurealuvandist -cp või keskkonnamuutujast CLASSPATH.

Bootstrap ClassLoader

Nagu me kõik seda teame Java klassid on laaditud java.lang.ClassLoade. Kuid kuna ClassLoaders on klassid, vastutab JDK siseklasside laadimise Bootstrap ClassLoader. BootStrap ClassLoader on masinakood, mis käivitab toimingu siis, kui JVM seda kutsub, ja laadib klassid rt.jarist. Niisiis, saate aru, et teenindataval Bootstrap ClassLoaderil ei ole vanemat ClassLoaderit ja see on seega tuntud kui Primordial ClassLoader.

Märge: Bootstrapi prioriteet on kõrgem kui Extension ja Extension ClassLoaderile antud prioriteet on suurem kui Application ClassLoader. Vaadake allolevat pilti:

iteratiivne fibonacci c ++

ClassLoaderi tüübid - ClassLoader Java-s - Edureka

Järgmisena saate selles artiklis mõista põhimõtteid, mille alusel ClassLoader töötab.

ClassLoaderi põhimõtted Java-s

Reeglite komplekt, mille põhjal Java ClassLoader töötab, on järgmised kolm põhimõtet:

Mõistkem neist igaüht.

Ainulaadsuse omadus

See omadus tagab, et klassid ei kordu ja kõik klassid on ainulaadsed. Atribuut unikaalsus tagab ka selle, et klassid laadib vanem ClassLoader, mitte laps ClassLoader. Stsenaariumi korral, kus vanem ClassLoader ei leia klassi, proovib praegune eksemplar seda ise teha.

Delegeerimise mudel

Java-s töötav ClassLoader töötab Delegatsioonimudeli antud toimingute kogumi põhjal. Seega, kui klassi või ressursi leidmiseks genereeritakse taotlus, delegeerib ClassLoaderi eksemplar klassi või ressursi otsimise vanemale ClassLoaderile.

Operatsioonide komplekt, mille põhjal ClassLoader töötab, on järgmine:

  • Java virtuaalne masin kontrollib alati klassi sattumist, kas klass on laaditud või mitte.
  • Juhul, kui klass on laaditud JVM jätkub klassi täitmisega, kuid stsenaariumi korral, kus klassi ei laadita, siisJVM palub Java ClassLoaderi alamsüsteemil laadida see konkreetne klass. Pärast seda annab ClassLoaderi alamsüsteem juhtimise Application ClassLoaderile.
  • Seejärel delegeerib Application ClassLoader päringu Extension ClassLoaderile, kes seejärel edastab taotluse Bootstrap ClassLoaderile.
  • Nüüd otsib Bootstrap ClassLoader jaotisestBootstrapi klassi rada, et kontrollida, kas klass on saadaval või mitte. Kui klass on saadaval, siis see laaditakse, muidu edastatakse taotlus uuesti Extension ClassLoaderile.
  • Extension ClassLoader kontrollib klassi laienduse klassirajal.Kui klass on saadaval, siis see laaditakse, vastasel juhul edastatakse taotlus uuesti rakendusele ClassLoader.
  • Lõpuks otsib rakendus ClassLoader klassi rakenduse klassirajal.Kui klass on saadaval, siis see on laaditud, muidu näete ClassNotFoundExceptioni erandit.

Vaadake allolevat pilti.

Nähtavuse põhimõte

Selle põhimõtte kohaselt on lasteklassid nähtavad tema vanemate ClassLoadersi laaditud klassidele, kuid vastupidi pole tõsi. Niisiis on rakenduse ClassLoader laaditud klassidel nähtavus klasside jaoks, mille on laadinud Extension ja Bootstrap ClassLoader.

Näiteks kui meil on kaks klassi: A ja B, eeldame, et klassi A laadib rakendus ClassLoader ja klassi B laadib Extensions ClassLoader. Siin on klassid A ja B nähtavad kõigile klassidele, mille on laadinud rakendus ClassLoader, kuid klass B on nähtav ainult neile klassidele, mille on laadinud Extension ClassLoader.

Samuti, kui proovite neid klasse laadida Bootstrap ClassLoaderi abil, näete java.lang.ClassNotFoundException . erand.

Olgu, nüüd, kui teate ClassLoaderite tüüpe ja selle põhimõtteid, uurime mõnda olulist meetoditalates java.lang.ClassLoader klass.

ClassLoaderi meetodid Java-s

Vähesed hädavajalikud ClassLoaderi versioonid on järgmised:

loadClass (stringi nimi, tõeväärtus)

See meetod on ClassLoaderi sisestuspunkt ja seda kasutatakse JVM-i viidatud klassi laadimiseks. See võtab nime parameetrina. JVM kutsub klassi viited lahendama meetodi loadClass (), määrates tõeväärtuseks tõeväärtuse. Ainult siis, kui peame tuvastama, kas klass on olemas või mitte, on tõeväärtuse parameeter seatud valeks.

teisendada kümnendkoht binaarseks püütoniks

Deklaratsioon:

public Class loadClass (stringi nimi, tõeväärtuse eraldus) viskab ClassNotFoundException {

defineClass ()

Viimane meetod, mida kasutatakse baitide massiivi määratlemiseks klassi eksemplarina. Kui klass on vale, siis viskab see klassi ClassFormatError.

Deklaratsioon:

kaitstud lõplik Class defineClass (stringi nimi, bait [] b, int väljas, int len) viskab klassiFormatError

findClass (stringi nimi)

Määratud klassi leidmiseks kasutatakse meetodit findClass. Niisiis, see leiab lihtsalt parameetrina täielikult kvalifitseeritud nimega klassi, kuid ei laadi klassi. Meetod loadClass () käivitab selle meetodi, kui vanem ClassLoader ei leia soovitud klassi. Samuti, kui ükski ClassLoaderi vanem ei leia klassi, viskab vaikimisi juurutamine a ClassNotFoundException.

Deklaratsioon:

kaitstud klassi findClass (stringi nimi) viskab klassi ClassNotFoundException

Class.forName (stringi nimi, boolean initsialiseerimine, ClassLoaderi laadur)

Seda meetodit kasutatakse klassi laadimiseks ja initsialiseerimiseks. See annab võimaluse valida ükskõik milline ClassLoader ja sisestada ClassLoaderi parameeter NULL, siis kasutatakse automaatselt Bootstrap ClassLoaderit.

Deklaratsioon:

avalik staatiline Class forName (stringi nimi, boolean initsialiseerimine, laadur ClassLoader) viskab ClassNotFoundException

getParent ()

Meetodit getParent kasutatakse vanema ClassLoaderi delegeerimiseks tagastamiseks.

Deklaratsioon:

avalik lõplik ClassLoader getParent ()

getResource ()

Nagu nimigi ütleb, püüdis meetod getResource () leida nimega ressursi. Esialgu delegeerib päringu ressursi vanemale ClassLoaderile. Kui vanem on null, otsitakse JVM-i sisseehitatud ClassLoaderi teed. Nüüd, kui see ebaõnnestub, kutsub meetod ressursi leidmiseks üles leidmaResource (String), kus ressursi nimi on määratud sisendina, mis võib olla kas absoluutne või suhteline klassitee. Seejärel tagastab ressursi lugemiseks URL-i objekti või tagastab nullväärtuse, kui ressursil pole ressursi tagastamiseks piisavalt õigusi või seda ei leita.

Deklaratsioon:

avalik URL getResource (stringi nimi)

Järgmisena andke meile sellest artiklist Java-s ClassLoaderi kohta mõista kohandatud ClassLoaderit.

Kohandatud ClassLoader Java-s

Sisseehitatud ClassLoaders hoolitseb enamiku juhtumite eest, kui failid on juba failisüsteemis, kuid kui soovite klassid kohalikult kõvakettalt laadida, peate kasutama kohandatud ClassLoadereid.

Looge kohandatud ClassLoader

Kohandatud ClassLoaderi loomiseks peate seda laiendama ClassLoader klassi ja alistada findClass () meetod:

Näide: Loogem kohandatud ClassLoader, mis laiendab ClassLoaderi vaikimisi ja laadib määratud failist baidimassiivi. Vaadake allolevat koodi.

pakett edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream avaliku klassi näidis laiendab ClassLoader {@Override public Class findClass (Stringi samplenimi) viskab ClassNotFoundException {byte [] b = customLoad (samplename) return defineClass (samplename, b, 0, b.length)} private byte [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', separatorChar) + '.class') bait [] puhver ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} püüd (IOException e) {e.printStackTrace ()} puhver = bStream.toByteArray () tagastuspuhver}}

Sellega jõuame selle artikli lõpule Java-s ClassLoaderis. Loodan, et saite aru, mis on Java ClassLoaderid, selle meetodid, erinevad ClassLoaderite tüübid jne.

Kui leiate selle artikli jaotisest „ClassLoader Java-s”, vaadake autor Edureka, usaldusväärne veebiõppeettevõte, mille võrgustik koosneb enam kui 250 000 rahulolevast õppijast ja mis levib üle kogu maailma. Oleme siin, et aidata teil igal sammul teie teekonnal, et saada javaintervjuu küsimustele lisaks, pakume välja õppekava, mis on mõeldud üliõpilastele ja spetsialistidele, kes soovivad olla Java Arendaja.

Kas teil on meile küsimus? Palun mainige seda selle jaotise kommentaaride jaotises „Java ClassLoader ' ja me pöördume teie poole niipea kui võimalik.