Kāda ir ClassLoader loma Java?



Šis raksts ir visaptverošs ceļvedis par to, kā ClassLoader darbojas Java. Tajā apspriesti Java klases veidi, principi un metodes.

Strādājot Java, mēs bieži izmantojam lielu skaitu nodarbību. Šīs Java klases netiek uzreiz ielādētas atmiņā, bet tiek ielādētas, kad to prasa lietojumprogramma. Šeit attēlā parādās Java ClassLoaders. Tāpēc šajā rakstā es apspriedīšu, kā kopā ar piemēriem izmantot ClassLoader Java.

Šajā rakstā tiks aplūkotas šādas tēmas:





  1. Kas ir ClassLoader?
  2. ClassLoader veidi
  3. ClassLoader principi
  4. ClassLoader metodes
  5. Pielāgots ClassLoader

Ļaujiet mums sākt darbu!

Kas ir ClassLoader Java?

ClassLoader Java izsauc Java Runtime Environment, lai dinamiski ielādētu klases, kad vien to prasa lietojumprogramma Java virtuālā mašīna . Tā kā ClassLoaders ir daļa no Java Runtime Environment, Java virtuālajai mašīnai nebūs ne jausmas par pamatā esošajiem failiem un failu sistēmām.



Ļaujiet mums saprast dažādos iebūvēto Java veidus ClassLoaders.

c ++ šķirošanas funkcija

ClassLoader veidi Java

Dažādi Java ClassLoaders veidi ir šādi:

Ļaujiet mums apspriest katru no tiem pa vienam.



Paplašinājuma ClassLoader

Kā norāda nosaukums, Extension ClassLoader ielādē Java galveno klašu paplašinājumus no JDK Paplašinājuma bibliotēka. Tas ir Bootstrap ClassLoader bērns un ielādē paplašinājumus no JRE / lib / text direktorija vai jebkura cita direktorija, kas norādīts sistēmas rekvizītā java.ext.dirs.

Lietojumprogramma vai System ClassLoader

Lietojumprogramma vai System ClassLoader ir Extension ClassLoader pakārtotais bērns. Šis ClassLoader tips ielādē visas lietojumprogrammu līmeņa klases, kas atrodamas komandrindas opcijā -cp vai vides mainīgajā CLASSPATH.

Bootstrap ClassLoader

Kā mēs visi to zinām Java klases tiek ielādēti ar java.lang.ClassLoade. Bet, tā kā ClassLoaders ir klases, Bootstrap ClassLoader ir atbildīgs par JDK iekšējo klašu ielādi. BootStrap ClassLoader ir mašīnas kods, kas sāk darbību, kad JVM to izsauc un ielādē klases no rt.jar. Tātad, jūs varat saprast, ka Bootstrap ClassLoader apkalpošanai nav vecāku ClassLoader un tādējādi to sauc par Primordial ClassLoader.

Piezīme: Bootstrap prioritāte ir augstāka nekā Extension, un Extension ClassLoader piešķirtā prioritāte ir augstāka nekā Application ClassLoader. Skatiet attēlu zemāk:

ClassLoader veidi - ClassLoader Java valodā - Edureka

Tālāk šajā rakstā ļaujiet mums saprast principus, uz kuriem darbojas ClassLoader.

ClassLoader principi Java valodā

Noteikumu kopums, uz kura pamata darbojas Java ClassLoader, ir šādi trīs principi:

Ļaujiet mums saprast katru no tiem.

Unikalitātes īpašums

Šis īpašums nodrošina, ka netiek atkārtotas klases un visas klases ir unikālas. Īpašums unikalitāte arī nodrošina, ka klases tiek ielādētas vecākam ClassLoader, nevis bērns ClassLoader. Gadījumā, ja vecākais ClassLoader nevar atrast klasi, pašreizējā instance mēģinās to izdarīt pati.

Deleģēšanas modelis

ClassLoader Java darbojas, pamatojoties uz deleģēšanas modeļa sniegto darbību kopumu. Tātad, ikreiz, kad tiek ģenerēts pieprasījums klases vai resursa atrašanai, ClassLoader instance deleģēs klases vai resursa meklēšanu vecākajam ClassLoader.

Darbību kopums, uz kura pamata darbojas ClassLoader, ir šāds:

  • Java virtuālā mašīna pārbauda, ​​vai klase ir ielādēta vai nē, ikreiz, kad tā sastopas ar klasi.
  • Gadījumā, ja klase ir ielādēta JVM turpina izpildīt klasi, bet scenārijā, kad klase netiek ielādēta, tadJVM lūdz Java ClassLoader apakšsistēmu ielādēt šo konkrēto klasi. Pēc tam ClassLoader apakšsistēma dod kontroli lietojumprogrammai ClassLoader.
  • Pēc tam lietojumprogramma ClassLoader deleģē pieprasījumu Extension ClassLoader, kas pēc tam nodod pieprasījumu Bootstrap ClassLoader.
  • Tagad Bootstrap ClassLoader meklēBootstrap klases ceļš, lai pārbaudītu, vai klase ir pieejama. Ja klase ir pieejama, tā tiek ielādēta, pretējā gadījumā pieprasījums atkal tiek pārsūtīts uz Extension ClassLoader.
  • Extension ClassLoader pārbauda klasi paplašinājuma classpath.Ja klase ir pieejama, tā tiek ielādēta, pretējā gadījumā pieprasījums atkal tiek pārsūtīts uz Application ClassLoader.
  • Visbeidzot, Application ClassLoader meklē klasi lietojumprogrammas classpath.Ja klase ir pieejama, tad tiek ielādēta, pretējā gadījumā jūs redzēsit izņēmumu no ClassNotFoundException.

Skatiet attēlu zemāk.

Redzamības princips

Saskaņā ar šo principu bērnu nodarbības ir redzamas klasēm, kuras ielādē vecāku ClassLoaders, taču otrādi nav taisnība. Tātad lietojumprogrammas ClassLoader ielādētajām klasēm ir redzamība klasēs, kuras ielādē Extension un Bootstrap ClassLoader.

Piemēram, ja mums ir divas klases: A un B, pieņemsim, ka A klasi ielādē Application ClassLoader un B klasi - Extensions ClassLoader. Šeit A un B klases ir redzamas visām tām klasēm, kuras ielādē Application ClassLoader, bet B klase ir redzama tikai tām klasēm, kuras ielādē Extension ClassLoader.

Turklāt, ja jūs mēģināt ielādēt šīs klases, izmantojot Bootstrap ClassLoader, jūs redzēsiet java.lang.ClassNotFoundException . izņēmums.

Labi, tagad, kad jūs zināt ClassLoaders veidus un principus, ļaujiet mums izpētīt dažas svarīgas metodesno java.lang.ClassLoader klasē.

ClassLoader metodes Java

Daži būtiski ClassLoader ir šādi:

loadClass (virknes nosaukums, Būla izšķirtspēja)

Šī metode ir ClassLoader ieejas punkts un tiek izmantota, lai ielādētu klasi, uz kuru atsaucas JVM. Tam ir nepieciešams nosaukums kā parametru. JVM izsauc metodi loadClass (), lai atrisinātu klases atsauces, iestatot būla vērtību kā true. Tikai tad, ja mums jānosaka, vai klase pastāv, vai nav, Būla parametrs ir iestatīts uz False.

kā izveidot paketi Java

Deklarācija:

public Class loadClass (virknes nosaukums, Būla izšķirtspēja) izmet ClassNotFoundException {

defineClass ()

Pēdējā metode, ko izmanto, lai definētu baitu masīvu kā klases instanci. Gadījumā, ja klase nav derīga, tā izmet ClassFormatError.

Deklarācija:

aizsargāts galīgais Class defineClass (virknes nosaukums, baits [] b, int izslēgts, int len) izmet ClassFormatError

findClass (virknes nosaukums)

Norādītās klases atrašanai tiek izmantota metode findClass. Tātad, tā vienkārši atrod klasi ar pilnībā kvalificētu nosaukumu kā parametru, bet neielādē klasi. Metode loadClass () izsauc šo metodi, ja vecākais ClassLoader nevar atrast pieprasīto klasi. Turklāt, ja neviens ClassLoader vecāks neatrod klasi, noklusējuma ieviešana izmet a ClassNotFoundException.

Deklarācija:

aizsargāta Class findClass (virknes nosaukums) izmet ClassNotFoundException

Class.forName (virknes nosaukums, būla inicializēšana, ClassLoader iekrāvējs)

Šo metodi izmanto klases ielādēšanai un inicializēšanai. Tas dod iespēju izvēlēties jebkuru no ClassLoaders un ievadīt parametru ClassLoader ir NULL, pēc tam automātiski tiek izmantota Bootstrap ClassLoader.

Deklarācija:

public static Class forName (virknes nosaukums, Būla inicializēšana, ClassLoader iekrāvējs) met ClassNotFoundException

getParent ()

GetParent metodi izmanto, lai vecākus ClassLoader atgrieztu deleģēšanai.

Deklarācija:

publiskais fināls ClassLoader getParent ()

getResource ()

Kā norāda nosaukums, getResource () metode mēģināja atrast resursu ar vārdu. Sākotnēji tas deleģēs pieprasījumu vecākam ClassLoader par resursu. Gadījumā, ja vecāks nav derīgs, tiek meklēts JVM iebūvētais ClassLoader ceļš. Ja tas neizdodas, tad metode izsauks findResource (String), lai atrastu resursu, kur resursa nosaukums ir norādīts kā ievade, kas var būt absolūtais vai relatīvais klases ceļš. Pēc tam tā atgriež URL objektu resursa lasīšanai vai atgriež nulles vērtību, ja resursam nav pietiekamu tiesību atjaunot resursu vai tas nav atrasts.

Deklarācija:

publiskais URL getResource (virknes nosaukums)

Pēc tam šajā rakstā par Java ClassLoader ļaujiet mums saprast pielāgoto ClassLoader.

Pielāgots ClassLoader Java

Iebūvētie ClassLoaders parūpēsies par lielāko daļu gadījumu, kad faili jau atrodas failu sistēmā, bet, ja vēlaties ielādēt klases no vietējā cietā diska, jums jāizmanto pielāgoti ClassLoaders.

Izveidojiet pielāgotu ClassLoader

Lai izveidotu pielāgotu ClassLoader, jums jāpaplašina ClassLoader klasē un ignorēt findClass () metode:

Piemērs: Izveidosim pielāgotu ClassLoader, kas paplašina noklusējuma ClassLoader un ielādē baitu masīvu no norādītā faila. Skatiet kodu zemāk.

pakete edureka importēt java.io.ByteArrayOutputStream importēt java.io.File importēt java.io.IOException importēt java.io.InputStream publiskās klases paraugs paplašina ClassLoader {@Override public Class findClass (virknes parauga nosaukums) met 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') baits [] buferis ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buferis = bStream.toByteArray () atgriešanās buferis}}

Ar to mēs esam nonākuši pie šī raksta par Java ClassLoader. Es ceru, ka jūs sapratāt, kas ir Java ClassLoaders, tās metodes, dažādie ClassLoaders veidi utt.

Ja atradāt šo rakstu sadaļā “ClassLoader Java”, pārbaudiet Autors: Edureka, uzticams tiešsaistes mācību uzņēmums ar vairāk nekā 250 000 apmierinātu izglītojamo tīklu visā pasaulē. Mēs esam šeit, lai palīdzētu jums katrā solī jūsu ceļojumā, lai kļūtu par papildus šiem Java intervijas jautājumiem, mēs piedāvājam mācību programmu, kas paredzēta studentiem un profesionāļiem, kuri vēlas būt Java Izstrādātājs.

Vai mums ir jautājums? Lūdzu, pieminējiet to šīs “ClassLoader in Java” komentāru sadaļā ' un mēs pēc iespējas ātrāk sazināsimies ar jums.