Koks yra „ClassLoader“ vaidmuo „Java“?



Šis straipsnis yra išsamus vadovas, kaip „ClassLoader“ veikia „Java“. Jame aptariami „Java“ „ClassLoader“ tipai, principai ir metodai.

Dirbdami „Java“, mes dažnai naudojame daugybę klasių. Šios „Java“ klasės į atmintį įkeliamos ne iš karto, o įkeliamos, kai to reikalauja programa. Čia patenka į „Java ClassLoaders“. Taigi šiame straipsnyje aptarsiu, kaip naudoti „ClassLoader“ „Java“ kartu su pavyzdžiais.

Šiame straipsnyje bus aptariamos šios temos:



  1. Kas yra „ClassLoader“?
  2. „ClassLoader“ tipai
  3. „ClassLoader“ principai
  4. „ClassLoader“ metodai
  5. Pasirinktinis „ClassLoader“

Pradėkime!

Kas yra „ClassLoader“ „Java“?

„ClassLoader“ „Java“ vadina „Java Runtime Environment“, kad dinamiškai įkeltų klases, kai to reikalauja programa „Java“ virtuali mašina . Kadangi „ClassLoaders“ yra „Java Runtime Environment“ dalis, „Java“ virtuali mašina neturės jokios idėjos apie pagrindinius failus ir failų sistemas.



Dabar supraskime skirtingus „Java“ įmontuotų „ClassLoaders“ tipus.

„Java“ „ClassLoader“ tipai

Skirtingi „Java“ „ClassLoaders“ tipai yra šie:

Aptarkime kiekvieną iš jų po vieną.



„Extension ClassLoader“

Kaip rodo pavadinimas, „Extension ClassLoader“ įkelia pagrindinių „Java“ klasių plėtinius iš „ JDK Pratęsimo biblioteka. Tai yra „Bootstrap ClassLoader“ vaikas ir įkelia plėtinius iš JRE / lib / text katalogo ar bet kurio kito katalogo, nurodyto sistemos ypatybėje java.ext.dirs.

Programa arba „System ClassLoader“

„Application“ arba „System ClassLoader“ yra „Extension ClassLoader“ pakaitalas. Šio tipo „ClassLoader“ įkelia visas programos lygio klases, esančias komandinės eilutės -cp parinktyje arba aplinkos kintamajame CLASSPATH.

„Bootstrap ClassLoader“

Kaip mes visi tai žinome „Java“ klasės yra įkeltas java.lang.ClassLoade. Kadangi „ClassLoaders“ yra klasės, „Bootstrap ClassLoader“ yra atsakinga už JDK vidinių klasių įkėlimą. „BootStrap ClassLoader“ yra kompiuterio kodas, paleidžiantis operaciją, kai JVM jam paskambina, ir įkelia klases iš „rt.jar“. Taigi, jūs galite suprasti, kad „Bootstrap ClassLoader“ tarnyba neturi pagrindinio „ClassLoader“ ir todėl yra žinoma kaip „Primordial ClassLoader“.

Pastaba: „Bootstrap“ prioritetas yra didesnis nei „Extension“, o „Extension ClassLoader“ suteikiamas prioritetas yra didesnis nei „Application ClassLoader“. Žiūrėkite žemiau esantį vaizdą:

„ClassLoader“ tipai - „ClassLoader“ sistemoje „Java“ - „Edureka“

Toliau šiame straipsnyje leiskite mums suprasti principus, pagal kuriuos veikia „ClassLoader“.

„ClassLoader“ principai „Java“

Taisyklių rinkinys, kuriuo remiantis veikia „Java ClassLoader“, yra šie trys principai:

Supraskime kiekvieną iš jų.

Unikalumo nuosavybė

Ši savybė užtikrina, kad klasės nesikartotų, o visos klasės yra unikalios. Unikalumo ypatybė taip pat užtikrina, kad klasės, kurias įkelia pagrindinis „ClassLoader“, nėra įkeltos antrinės „ClassLoader“. Tokiu atveju, kai pagrindinis „ClassLoader“ negali rasti klasės, dabartinis egzempliorius bandys tai padaryti pats.

Delegavimo modelis

„Java“ „ClassLoader“ veikia pagal operacijų rinkinį, kurį pateikia „Delegation Model“. Taigi, kai generuojama užklausa rasti klasei ar ištekliui, „ClassLoader“ egzempliorius klasės ar išteklių paiešką perduos pagrindiniam „ClassLoader“.

Operacijų rinkinys, kuriuo remiantis veikia „ClassLoader“, yra toks:

  • „Java“ virtuali mašina tikrina, ar klasė yra įkelta, ar ne, kai tik ji susiduria su klase.
  • Tuo atveju, kai klasė yra pakrauta JVM tęsiama vykdant klasę, tačiau scenarijuje, kai klasė nėra įkelta, tadaJVM prašo „Java ClassLoader“ posistemio įkelti tą konkrečią klasę. Po to „ClassLoader“ posistemis suteikia galimybę valdyti „Application ClassLoader“.
  • Tada „Application ClassLoader“ perduoda užklausą „Extension ClassLoader“, kuri perduoda užklausą „Bootstrap ClassLoader“.
  • Dabar „Bootstrap ClassLoader“ ieško„Bootstrap classpath“, norėdami patikrinti, ar klasė yra, ar ne. Jei klasė yra prieinama, tada ji yra įkeliama, kitaip užklausa vėl perduodama „Extension ClassLoader“.
  • „Extension ClassLoader“ tikrina klasę, esančią plėtinio classpath.Jei klasė yra prieinama, ji yra įkeliama, kitaip užklausa vėl perduodama „Application ClassLoader“.
  • Galiausiai „Application ClassLoader“ ieško klasės programos klasės kelyje.Jei klasė yra prieinama, tada yra įkelta, kitaip pamatysite „ClassNotFoundException“ išimtį.

Žiūrėkite žemiau esantį vaizdą.

Matomumo principas

Pagal šį principą vaikų klasės matomos klasėms, kurias įkėlė jos tėvai „ClassLoaders“, tačiau atvirkščiai nėra tiesa. Taigi „Application ClassLoader“ įkeltos klasės gali matyti „Extension“ ir „Bootstrap ClassLoader“ įkeltas klases.

Pvz., Jei turime dvi klases: A ir B, tarkime, kad A klasę pakrauna „Application ClassLoader“, o B klasę - „Extensions ClassLoader“. Čia A ir B klasės yra matomos visoms „Class ClassLoader“ įkeltoms klasėms, tačiau B klasė matoma tik toms „Extension ClassLoader“ pakrautoms klasėms.

Be to, jei bandysite įkelti šias klases naudodami „Bootstrap ClassLoader“, pamatysite java.lang.ClassNotFoundException . išimtis.

Gerai, dabar, kai žinote „ClassLoaders“ tipus ir jų principus, panagrinėkime keletą svarbių metodųnuo java.lang.ClassLoader klasė.

„ClassLoader“ metodai „Java“

Nedaug esminių „ClassLoader“ yra šie:

loadClass (eilutės pavadinimas, loginis skiriamoji geba)

Šis metodas yra „ClassLoader“ įvesties taškas ir naudojamas įkelti klasę, nurodytą JVM. Tai turi pavadinimą kaip parametrą. JVM pasitelkia metodą „loadClass ()“, kad išspręstų klasės nuorodas, nustatydamas loginę reikšmę kaip „true“. Tik tuo atveju, jei turime nustatyti, ar klasė egzistuoja, ar ne, loginis parametras yra nustatytas į „false“.

Deklaracija:

public Class loadClass (eilutės pavadinimas, loginis sprendimas) išmeta ClassNotFoundException {

defineClass ()

Paskutinis metodas, naudojamas baitų masyvui apibrėžti kaip klasės egzemplioriui. Jei klasė yra neteisinga, ji išmeta „ClassFormatError“.

Deklaracija:

apsaugotas galutinis Class defineClass (eilutės pavadinimas, baitas [] b, int off, int len) meta ClassFormatError

„findClass“ (eilutės pavadinimas)

Nurodytai klasei rasti naudojamas „findClass“ metodas. Taigi, ji tiesiog suranda klasę su visiškai kvalifikuotu pavadinimu kaip parametru, bet klasės neįkrauna. Metodas „loadClass ()“ iškviečia šį metodą, jei pagrindinis „ClassLoader“ negali rasti prašomos klasės. Be to, jei nė vienas „ClassLoader“ tėvas neranda klasės, numatytasis diegimas išmeta a „ClassNotFoundException“.

Deklaracija:

apsaugota „ClassClass“ (eilutės pavadinimas) išmeta „ClassNotFoundException“

„Class.forName“ (eilutės pavadinimas, loginis inicializavimas, „ClassLoader“ krautuvas)

Šis metodas naudojamas įkelti ir inicializuoti klasę. Tai suteikia galimybę pasirinkti bet kurį iš „ClassLoaders“ ir įterpti „ClassLoader“ parametrą yra NULL, tada automatiškai naudojamas „Bootstrap ClassLoader“.

Deklaracija:

public static „Class forName“ (eilutės pavadinimas, loginis inicializavimas, „ClassLoader“ krautuvas) išmeta „ClassNotFoundException“

„getParent“ ()

„GetParent“ metodas naudojamas tėvams „ClassLoader“ grąžinti deleguoti.

Deklaracija:

viešas finalas „ClassLoader getParent“ ()

getResource ()

Kaip rodo pavadinimas, getResource () metodas bandė rasti šaltinį su nurodytu vardu. Iš pradžių ji perduos užklausą pagrindiniam „ClassLoader“ ištekliui. Jei tėvas yra nulinis, tada ieškoma „ClassLoader“ kelio, įmontuoto į JVM. Jei nepavyksta, metodas iškvies „findResource“ (String), kad surastų šaltinį, kur šaltinio pavadinimas nurodomas kaip įvestis, kuris gali būti absoliutus arba santykinis klasės kelias. Tada jis grąžina URL objektą, skirtą ištekliui skaityti, arba grąžina nulinę vertę, jei šaltinis neturi pakankamai teisių grąžinti išteklių arba jo neranda.

Deklaracija:

viešasis URL „getResource“ (eilutės pavadinimas)

Toliau šiame straipsnyje apie „Java“ „ClassLoader“ supraskime „Custom ClassLoader“.

„Custom ClassLoader“ „Java“

Įtaisytieji „ClassLoaders“ pasirūpins daugeliu atvejų, kai failai jau yra failų sistemoje, tačiau jei norite įkelti klases iš vietinio kietojo disko, turite naudoti pasirinktinius „ClassLoaders“.

Sukurkite pasirinktinį „ClassLoader“

Norėdami sukurti pasirinktinį „ClassLoader“, turite pratęsti „ClassLoader“ klasę ir nepaisyti „findClass“ () metodas:

Pavyzdys: Sukurkime pasirinktinį „ClassLoader“, kuris pratęsia numatytąjį „ClassLoader“ ir įkelia baitų masyvą iš nurodyto failo. Žiūrėkite žemiau esantį kodą.

paketas edureka importuoti java.io.ByteArrayOutputStream importuoti java.io.File importuoti java.io.IOException importuoti java.io.InputStream viešosios klasės pavyzdį pratęsia ClassLoader {@Override public Class findClass (eilutės pavyzdžio pavadinimas) meta 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') baitas [] buferis ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} pagauti (IOException e) {e.printStackTrace ()} buferis = bStream.toByteArray () grąžinimo buferis}}

Tuo mes baigėme šį straipsnį apie „Java“ „ClassLoader“. Tikiuosi, kad supratote, kas yra „Java“ „ClassLoaders“, jos metodai, įvairūs „ClassLoaders“ tipai ir kt.

Jei radote šį straipsnį „Java“ „ClassLoader“, patikrinkite sukūrė patikima internetinė mokymosi įmonė „Edureka“, turinti daugiau nei 250 000 patenkintų besimokančiųjų tinklą visame pasaulyje. Mes esame čia, kad padėtume jums kiekviename jūsų kelionės žingsnyje, kad taptume ne tik šiais „Java“ interviu klausimais, mes pateikiame mokymo programą, skirtą studentams ir specialistams, norintiems būti „Java“ Programuotojas.

Turite mums klausimą? Prašau tai paminėti šios „ClassLoader in Java“ komentarų skyriuje ' ir mes kuo greičiau susisieksime su jumis.

kaip sudaryti java