Hvad er rollen for en ClassLoader i Java?

Denne artikel er en omfattende guide til, hvordan ClassLoader fungerer i Java. Den diskuterer typer, principper og metoder til ClassLoader i Java.

Mens vi arbejder i Java, bruger vi ofte et stort antal klasser. Disse Java-klasser indlæses ikke på én gang i hukommelsen, men i stedet indlæses de, når et program kræver det. Det er her Java ClassLoaders kommer ind i billedet. Så i denne artikel vil jeg diskutere, hvordan man bruger ClassLoader i Java sammen med eksempler.



Følgende emner vil blive behandlet i denne artikel:



  1. Hvad er ClassLoader?
  2. Typer af ClassLoader
  3. Principper for ClassLoader
  4. Metoder til ClassLoader
  5. Brugerdefineret ClassLoader

Lad os komme i gang!

Hvad er ClassLoader i Java?

ClassLoader i Java kaldes af Java Runtime Environment til dynamisk at indlæse klasserne, når det kræves af applikationen i Java Virtual Machine . Da ClassLoaders er en del af Java Runtime-miljøet, vil Java Virtual Machine ikke have nogen idé om de underliggende filer og filsystemer.



Lad os nu forstå de forskellige typer indbyggede ClassLoaders i Java.

hvad er løs kobling i java

Typer af ClassLoader i Java

De forskellige typer ClassLoaders i Java er som følger:

Lad os diskutere hver enkelt af dem en efter en.



Udvidelse ClassLoader

Som navnet antyder, indlæser Extension ClassLoader udvidelserne af de centrale Java-klasser fra JDK Udvidelsesbibliotek. Det er et barn af Bootstrap ClassLoader og indlæser udvidelserne fra JRE / lib / text-biblioteket eller enhver anden mappe, der er specificeret i systemegenskaben java.ext.dirs.

Applikation eller System ClassLoader

Applikationen eller System ClassLoader er et barn af Extension ClassLoader. Denne type ClassLoader indlæser alle de applikationsniveauklasser, der findes i kommandolinjen -cp eller i miljøvariablen CLASSPATH.

Bootstrap ClassLoader

Som vi alle ved det Java-klasser indlæses af en forekomst af java.lang.ClassLoade. Men da ClassLoaders er klasser, er Bootstrap ClassLoader ansvarlig for at indlæse de interne JDK-klasser. BootStrap ClassLoader er en maskinkode, der starter operationen, når JVM kalder den og indlæser klasserne fra rt.jar. Så du kan forstå, at Bootstrap ClassLoader tjener ikke har nogen overordnet ClassLoader og derfor er kendt som Primordial ClassLoader.

Bemærk: Prioriteten for Bootstrap er højere end Extension, og prioriteten til Extension ClassLoader er højere end Application ClassLoader. Se billedet nedenfor:

Typer af ClassLoader - ClassLoader i Java - Edureka

Lad os næste i denne artikel forstå de principper, som ClassLoader arbejder på.

Principper for ClassLoader i Java

Regelsættet, som Java ClassLoader fungerer på, er følgende tre principper:

Lad os forstå hver enkelt af dem.

Unik ejendom

Denne egenskab sikrer, at der ikke er gentagelse af klasser, og at alle klasserne er unikke. Unikke egenskaben sørger også for, at klasser indlæses af den overordnede ClassLoader ikke indlæses af den underordnede ClassLoader. I et scenarie, hvor den overordnede ClassLoader ikke kan finde klassen, vil den aktuelle instans forsøge at gøre det af sig selv.

Delegationsmodel

ClassLoader i Java arbejder baseret på det sæt operationer, der gives af delegationsmodellen. Så når der genereres en anmodning om at finde en klasse eller en ressource, vil en ClassLoader-forekomst delegere søgningen i klassen eller ressourcen til den overordnede ClassLoader.

Sættet med operationer, som ClassLoader fungerer på, er som følger:

  • Java Virtual Machine kontrollerer, om klassen er indlæst eller ej, når den kommer på tværs af en klasse.
  • I det tilfælde hvor klassen er indlæst JVM fortsætter med udførelse af klasse, men i et scenarie, hvor klassen ikke er indlæst, såJVM beder Java ClassLoader-undersystemet om at indlæse den pågældende klasse. Derefter giver ClassLoader-undersystemet kontrol over Application ClassLoader.
  • Application ClassLoader delegerer derefter anmodningen til Extension ClassLoader, som derefter videresender anmodningen til Bootstrap ClassLoader.
  • Nu søger Bootstrap ClassLoader iBootstrap klassesti for at kontrollere, om klassen er tilgængelig eller ej. Hvis klassen er tilgængelig, indlæses den, ellers sendes anmodningen igen til Extension ClassLoader.
  • Extension ClassLoader kontrollerer for klassen i udvidelsesklassestien.Hvis klassen er tilgængelig, indlæses den, ellers sendes anmodningen igen til Application ClassLoader.
  • Endelig søger Application ClassLoader efter klassen i applikationsklassestien.Hvis klassen er tilgængelig, så indlæses, ellers vil du se en undtagelse fra ClassNotFoundException.

Se billedet nedenfor.

Princip for synlighed

Ifølge dette princip er børnenes klasser synlige for de klasser, der er indlæst af dets forældre ClassLoaders, men omvendt er det ikke sandt. Så de klasser, der er indlæst af Application ClassLoader, har synlighed i de klasser, der er indlæst af Extension og Bootstrap ClassLoader.

For eksempel, hvis vi har to klasser: A & B, antag at klasse A indlæses af Application ClassLoader, og klasse B indlæses af Extensions ClassLoader. Her er klasser A og B synlige for alle de klasser, der er indlæst af Application ClassLoader, men klasse B er kun synlig for de klasser, der er indlæst af Extension ClassLoader.

Også, hvis du prøver at indlæse disse klasser ved hjælp af Bootstrap ClassLoader, vil du se java.lang.ClassNotFoundException . undtagelse.

Okay, nu hvor du kender typer ClassLoaders og principperne bag det, lad os se på et par vigtige metoderfra java.lang.ClassLoader klasse.

Metoder til ClassLoader i Java

Få væsentlige af ClassLoader er som følger:

loadClass (strengnavn, boolsk opløsning)

Denne metode er indgangsstedet for ClassLoader og bruges til at indlæse den klasse, som JVM refererer til. Det tager navnet på som en parameter. JVM påkalder metoden loadClass () for at løse klassereferencer ved at indstille den boolske værdi til sand. Kun hvis vi har brug for at bestemme, om klassen eksisterer eller ej, er den boolske parameter indstillet til falsk.

c ++ goto-sætning

Erklæring:

public Class loadClass (String name, boolean resolution) kaster ClassNotFoundException {

defineClass ()

En endelig metode, der bruges til at definere en række bytes som en forekomst af en klasse. Hvis klassen er ugyldig, kaster den en ClassFormatError.

Erklæring:

beskyttet endelig klasse defineClass (strengnavn, byte [] b, int off, int len) kaster ClassFormatError

findClass (strengnavn)

Metoden findClass bruges til at finde den angivne klasse. Så det finder bare klassen med et fuldt kvalificeret navn som parameter, men indlæser ikke klassen. Metoden loadClass () påkalder denne metode, hvis den overordnede ClassLoader ikke kan finde den ønskede klasse. Også, hvis ingen forældre til ClassLoader finder klassen, kaster standardimplementeringen a ClassNotFoundException.

Erklæring:

beskyttet klasse findClass (strengnavn) kaster ClassNotFoundException

Class.forName (strengnavn, boolsk initialisering, ClassLoader loader)

Denne metode bruges til at indlæse og initialisere klassen. Det giver mulighed for at vælge en af ​​ClassLoaders og i tilfælde af, at ClassLoader-parameteren er NULL, derefter bruges Bootstrap ClassLoader automatisk.

Erklæring:

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

getParent ()

Metoden getParent bruges til at returnere den overordnede ClassLoader til delegation.

Erklæring:

offentlig endelig ClassLoader getParent ()

getResource ()

Som navnet antyder, forsøgte getResource () -metoden at finde en ressource med det givne navn. Den delegerer oprindeligt anmodningen til den overordnede ClassLoader for ressourcen. Hvis forældrene er nul, søges stien til ClassLoader indbygget i JVM. Hvis dette mislykkes, påkalder metoden findResource (String) for at finde ressourcen, hvor ressourcenavnet er angivet som et input, der enten kan være den absolutte eller relative klassesti. Derefter returnerer det et URL-objekt til læsning af ressourcen eller returnerer en null-værdi, hvis ressourcen ikke har tilstrækkelige privilegier til at returnere ressourcen eller ikke findes.

Erklæring:

offentlig URL getResource (strengnavn)

Lad os derefter i denne artikel om ClassLoader i Java forstå Custom ClassLoader.

Custom ClassLoader i Java

De indbyggede ClassLoaders tager sig af de fleste tilfælde, hvor filerne allerede er i filsystemet, men hvis du vil indlæse klasserne ud af den lokale harddisk, skal du bruge brugerdefinerede ClassLoaders.

Opret brugerdefineret ClassLoader

For at oprette en brugerdefineret ClassLoader skal du udvide ClassLoader klasse og tilsidesætte findClass () metode:

Eksempel: Lad os oprette en brugerdefineret ClassLoader, der udvider standard ClassLoader og indlæser et byte-array fra den angivne fil. Se koden nedenfor.

pakke edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream offentlig klasse Eksempel udvider 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 ende på denne artikel om ClassLoader i Java. Jeg håber, du forstod, hvad der er ClassLoaders i Java, dets metoder, de forskellige typer ClassLoaders osv.

Hvis du fandt denne artikel om “ClassLoader i Java”, skal du tjekke af Edureka, et pålideligt online læringsfirma med et netværk på mere end 250.000 tilfredse elever spredt over hele kloden. Vi er her for at hjælpe dig med hvert trin på din rejse, for at blive en ud over dette java-interviewspørgsmål, kommer vi med en læseplan, der er designet til studerende og fagfolk, der ønsker at være en Java Udvikler.

Har du et spørgsmål til os? Nævn det i kommentarfeltet i denne “ClassLoader i Java ' og vi vender tilbage til dig hurtigst muligt.