Hva er rollen for en ClassLoader i Java?



Denne artikkelen er en omfattende guide om hvordan ClassLoader fungerer i Java. Den diskuterer typene, prinsippene og metodene til ClassLoader i Java.

Mens vi jobber i Java bruker vi ofte et stort antall klasser. Disse Java-klassene er ikke lastet inn samtidig i minnet, i stedet lastes de når det kreves av et program. Det er her Java ClassLoaders kommer inn i bildet. Så i denne artikkelen vil jeg diskutere hvordan du bruker ClassLoader i Java sammen med eksempler.

Følgende emner vil bli dekket i denne artikkelen:





  1. Hva er ClassLoader?
  2. Typer ClassLoader
  3. Prinsipper for ClassLoader
  4. Metoder for ClassLoader
  5. Tilpasset ClassLoader

La oss komme i gang!

Hva er ClassLoader i Java?

ClassLoader i Java kalles av Java Runtime Environment for dynamisk å laste klassene når det kreves av applikasjonen i Java Virtual Machine . Siden ClassLoaders er en del av Java Runtime Environment, vil ikke Java Virtual Machine ha noen anelse om de underliggende filene og filsystemene.



La oss nå forstå de forskjellige typene innebygde ClassLoaders i Java.

Typer ClassLoader i Java

De forskjellige typene ClassLoaders i Java er som følger:

La oss diskutere hver og en av dem en etter en.



Extension ClassLoader

Som navnet antyder, laster Extension ClassLoader utvidelsene til de viktigste Java-klassene fra JDK Utvidelsesbibliotek. Det er et barn av Bootstrap ClassLoader og laster utvidelsene fra JRE / lib / text-katalogen eller en hvilken som helst annen katalog spesifisert i systemegenskapen java.ext.dirs.

Applikasjon eller System ClassLoader

Applikasjonen eller System ClassLoader er et barn av Extension ClassLoader. Denne typen ClassLoader laster inn alle applikasjonsnivåklassene som finnes i kommandolinjealternativet -cp eller i miljøvariabelen CLASSPATH.

Bootstrap ClassLoader

Som vi alle vet det Java-klasser lastes av en forekomst av java.lang.ClassLoade. Men siden ClassLoaders er klasser, er Bootstrap ClassLoader ansvarlig for å laste inn de interne JDK-klassene. BootStrap ClassLoader er en maskinkode som starter operasjonen når JVM kaller den og laster klassene fra rt.jar. Så du kan forstå at Bootstrap ClassLoader serverer ingen foreldre ClassLoader og er dermed kjent som Primordial ClassLoader.

Merk: Prioriteten til Bootstrap er høyere enn Extension, og prioriteten som blir gitt til Extension ClassLoader er høyere enn Application ClassLoader. Se bildet nedenfor:

Typer ClassLoader - ClassLoader i Java - Edureka

Neste i denne artikkelen, la oss forstå prinsippene som ClassLoader arbeider med.

Prinsipper for ClassLoader i Java

Regelsettet som Java ClassLoader arbeider med er følgende tre prinsipper:

La oss forstå hver enkelt av dem.

Unikhet Eiendom

Denne egenskapen sørger for at det ikke er noen repetisjon av klassene, og alle klassene er unike. Unikitetsegenskapen sørger også for at klasser lastes inn av den overordnede ClassLoader ikke lastes av underordnede ClassLoader. I et scenario der den overordnede ClassLoader ikke finner klassen, vil den nåværende forekomsten prøve å gjøre det av seg selv.

Delegasjonsmodell

ClassLoader i Java jobber basert på settet med operasjoner gitt av delegasjonsmodellen. Så når en forespørsel genereres for å finne en klasse eller en ressurs, vil en ClassLoader-forekomst delegere søket i klassen eller ressursen til den overordnede ClassLoader.

Operasjonssettet som ClassLoader arbeider med er som følger:

  • Java Virtual Machine sjekker om klassen er lastet eller ikke, når den kommer over en klasse.
  • I tilfelle der klassen er lastet JVM fortsetter med utføring av klasse, men i et scenario der klassen ikke er lastet, daJVM ber Java ClassLoader-delsystemet om å laste den aktuelle klassen. Etter det gir ClassLoader-delsystemet kontroll over Application ClassLoader.
  • Application ClassLoader delegerer deretter forespørselen til Extension ClassLoader, som deretter sender forespørselen til Bootstrap ClassLoader.
  • Nå søker Bootstrap ClassLoader iBootstrap classpath for å sjekke om klassen er tilgjengelig eller ikke. Hvis klassen er tilgjengelig, blir den lastet, ellers sendes forespørselen igjen til Extension ClassLoader.
  • Extension ClassLoader ser etter klassen i utvidelsesklassen.Hvis klassen er tilgjengelig, blir den lastet, ellers blir forespørselen sendt videre til Application ClassLoader.
  • Til slutt søker Application ClassLoader etter klassen i programklassen.Hvis klassen er tilgjengelig, blir den lastet, ellers vil du se et unntak av ClassNotFoundException.

Se bildet nedenfor.

Synlighetsprinsipp

I henhold til dette prinsippet er barneklassene synlige for klassene som er lastet av foreldrenes ClassLoaders, men omvendt er ikke sant. Så klassene lastet av Application ClassLoader har synlighet i klassene lastet av Extension og Bootstrap ClassLoader.

For eksempel, hvis vi har to klasser: A & B, antar at klasse A er lastet av Application ClassLoader og klasse B er lastet av Extensions ClassLoader. Her er klassene A og B synlige for alle de klassene som er lastet inn av Application ClassLoader, men klasse B er bare synlig for de klassene som er lastet inn av Extension ClassLoader.

Hvis du prøver å laste disse klassene ved hjelp av Bootstrap ClassLoader, vil du også se java.lang.ClassNotFoundException . unntak.

OK, nå som du kjenner til typene ClassLoaders og prinsippene bak, la oss se på noen viktige metoderfra java.lang.ClassLoader klasse.

Metoder for ClassLoader i Java

Få essensielle av ClassLoader er som følger:

loadClass (strengnavn, boolsk løsning)

Denne metoden er inngangspunktet for ClassLoader og brukes til å laste inn klassen det refereres til av JVM. Det tar navnet på som parameter. JVM påkaller loadClass () -metoden for å løse klassereferansene ved å sette den boolske verdien til sann. Bare hvis vi trenger å bestemme om klassen eksisterer eller ikke, er den boolske parameteren satt til falsk.

Erklæring:

offentlig klasse loadClass (strengnavn, boolsk løsning) kaster ClassNotFoundException {

defineClass ()

En siste metode som brukes til å definere en rekke bytes som en forekomst av en klasse. I tilfelle klassen er ugyldig, kaster den en ClassFormatError.

Erklæring:

beskyttet endelig Class defineClass (strengnavn, byte [] b, int av, int len) kaster ClassFormatError

findClass (strengnavn)

FindClass-metoden brukes til å finne den spesifiserte klassen. Så den finner bare klassen med et fullt kvalifisert navn som parameter, men laster ikke klassen. LoadClass () -metoden påkaller denne metoden hvis den overordnede ClassLoader ikke finner den valgte klassen. Også, hvis ingen foreldre til ClassLoader finner klassen, kaster standardimplementeringen a ClassNotFoundException.

Erklæring:

beskyttet Class findClass (strengnavn) kaster ClassNotFoundException

Class.forName (strengnavn, boolsk initialisering, ClassLoader-laster)

Denne metoden brukes til å laste inn og initialisere klassen. Det gir et alternativ å velge hvilken som helst av ClassLoaders og i tilfelle ClassLoader-parameteren er NULL, så blir Bootstrap ClassLoader automatisk brukt.

Erklæring:

offentlig statisk Class forName (strengnavn, boolsk initialisering, ClassLoader loader) kaster ClassNotFoundException

getParent ()

GetParent-metoden brukes til å returnere den overordnede ClassLoader for delegering.

Erklæring:

offentlig finale ClassLoader getParent ()

getResource ()

Som navnet antyder, prøvde getResource () -metoden å finne en ressurs med gitt navn. Først vil den delegere forespørselen til den overordnede ClassLoader for ressursen. I tilfelle foreldrene er null, blir det søkt etter banen til ClassLoader innebygd i JVM. Nå, hvis dette mislykkes, vil metoden påkalle findResource (String) for å finne ressursen, der ressursnavnet er spesifisert som en inngang som enten kan være den absolutte eller relative klassesiden. Deretter returnerer den et URL-objekt for å lese ressursen eller returnerer en nullverdi hvis ressursen ikke har tilstrekkelige privilegier for å returnere ressursen eller ikke blir funnet.

Erklæring:

offentlig URL getResource (strengnavn)

Neste, i denne artikkelen om ClassLoader i Java, la oss forstå Custom ClassLoader.

Tilpasset ClassLoader i Java

De innebygde ClassLoaders tar seg av de fleste tilfeller der filene allerede er i filsystemet, men hvis du vil laste klassene ut av den lokale harddisken, må du bruke tilpassede ClassLoaders.

Opprett tilpasset ClassLoader

For å lage en tilpasset ClassLoader, må du utvide ClassLoader klasse og overstyre findClass () metode:

Eksempel: La oss lage en egendefinert ClassLoader som utvider standard ClassLoader og laster inn en byte-array fra den angitte filen. Se koden nedenfor.

pakke edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream offentlig klasse Eksempel utvider ClassLoader {@ Override public Class findClass (String samplename) kaster ClassNotFoundException {byte [] b = customLad (samplename) return defineClass (samplename, b, 0, b.length)} private byte [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', File. separatorChar) + '.class') byte [] buffer ByteArrayOutputStream bStream = ny ByteArrayOutputStream () int nextValue = 0 prøv {mens ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} fange (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () returbuffer}}

Med dette kommer vi til en slutt på denne artikkelen om ClassLoader i Java. Jeg håper du forsto hva som er ClassLoaders i Java, metodene, de forskjellige typene ClassLoaders osv.

standardverdi for streng i java

Hvis du fant denne artikkelen om “ClassLoader in Java”, sjekk ut av Edureka, et pålitelig online læringsfirma med et nettverk av mer enn 250 000 fornøyde elever spredt over hele verden. Vi er her for å hjelpe deg med hvert trinn på reisen, for å bli en foruten dette java-intervjuspørsmålene, kommer vi med en læreplan som er designet for studenter og fagpersoner som ønsker å være en Java Utvikler.

Har du et spørsmål til oss? Vennligst nevn det i kommentarfeltet til denne “ClassLoader i Java ' og vi kommer tilbake til deg så snart som mulig.