Vilken roll har en ClassLoader i Java?

Den här artikeln är en omfattande guide om hur ClassLoader fungerar i Java. Den diskuterar typer, principer och metoder för ClassLoader i Java.

När vi arbetar i Java använder vi ofta ett stort antal klasser. Dessa Java-klasser laddas inte in samtidigt i minnet, utan laddas in när det krävs av ett program. Det är här Java ClassLoaders kommer in i bilden. Så i den här artikeln kommer jag att diskutera hur man använder ClassLoader i Java tillsammans med exempel.

Följande ämnen kommer att behandlas i den här artikeln:



  1. Vad är ClassLoader?
  2. Typer av ClassLoader
  3. Principer för ClassLoader
  4. Metoder för ClassLoader
  5. Anpassad ClassLoader

Låt oss komma igång!

Vad är ClassLoader i Java?

ClassLoader i Java kallas av Java Runtime Environment för att dynamiskt ladda klasserna när det krävs av applikationen i Java Virtual Machine . Eftersom ClassLoaders är en del av Java Runtime-miljön kommer Java Virtual Machine inte att ha någon aning om de underliggande filerna och filsystemen.

Låt oss nu förstå de olika typerna av inbyggda ClassLoaders i Java.

Typer av ClassLoader i Java

De olika typerna av ClassLoaders i Java är följande:

Låt oss diskutera var och en av dem en efter en.

Extension ClassLoader

Som namnet antyder laddar Extension ClassLoader tilläggen till Java-klasserna från JDK Tilläggsbibliotek. Det är ett barn till Bootstrap ClassLoader och laddar tilläggen från JRE / lib / textkatalogen eller någon annan katalog som anges i systemegenskapen java.ext.dirs.

Applikation eller System ClassLoader

Applikationen eller System ClassLoader är ett barn till Extension ClassLoader. Denna typ av ClassLoader laddar alla klasser på programnivå som finns i kommandoradsalternativet -cp eller i miljövariabeln CLASSPATH.

vad gör init i python

Bootstrap ClassLoader

Som vi alla vet det Java-klasser laddas av en instans av java.lang.ClassLoade. Men eftersom ClassLoaders är klasser är Bootstrap ClassLoader ansvarig för att ladda de interna JDK-klasserna. BootStrap ClassLoader är en maskinkod som startar operationen när JVM anropar den och laddar klasserna från rt.jar. Så du kan förstå att Bootstrap ClassLoader serverar har ingen överordnad ClassLoader och är därför känd som Primordial ClassLoader.

Notera: Prioriteten för Bootstrap är högre än Extension, och prioriteten för Extension ClassLoader är högre än Application ClassLoader. Se bilden nedan:

Typer av ClassLoader - ClassLoader i Java - Edureka

Nästa i den här artikeln, låt oss förstå de principer som ClassLoader arbetar med.

__init__ i python

Principer för ClassLoader i Java

Uppsättningen regler baserade på vilka Java ClassLoader fungerar är följande tre principer:

Låt oss förstå var och en av dem.

Unik egendom

Den här egenskapen säkerställer att det inte finns någon repetition av klasser och att alla klasser är unika. Egenskapen unikt ser också till att klasser laddas av överordnade ClassLoader inte laddas av underordnade ClassLoader. I ett scenario där den överordnade ClassLoader inte kan hitta klassen kommer den aktuella instansen att försöka göra det själv.

Delegationsmodell

ClassLoader i Java fungerar baserat på den uppsättning operationer som ges av delegationsmodellen. Så när en begäran genereras för att hitta en klass eller en resurs, kommer en ClassLoader-instans att delegera sökningen i klassen eller resursen till den överordnade ClassLoader.

Den uppsättning operationer som ClassLoader arbetar med är följande:

  • Java Virtual Machine kontrollerar om klassen är laddad eller inte, när den kommer över en klass.
  • Om klassen laddas JVM fortsätter med exekvering av klass, men i ett scenario där klassen inte laddas, dåJVM ber Java ClassLoader-delsystemet att ladda den specifika klassen. Efter det ger ClassLoader delsystem kontroll till Application ClassLoader.
  • Application ClassLoader delegerar sedan begäran till Extension ClassLoader, som sedan skickar begäran till Bootstrap ClassLoader.
  • Nu söker Bootstrap ClassLoader iBootstrap klassväg för att kontrollera om klassen är tillgänglig eller inte. Om klassen är tillgänglig laddas den, annars skickas begäran igen till Extension ClassLoader.
  • Extension ClassLoader söker efter klassen i tilläggsklassvägen.Om klassen är tillgänglig laddas den, annars skickas begäran igen till Application ClassLoader.
  • Slutligen söker Application ClassLoader efter klassen i klassens sökväg.Om klassen är tillgänglig laddas den, annars ser du ett undantag från ClassNotFoundException.

Se bilden nedan.

Synlighetsprincip

Enligt denna princip är barnklasserna synliga för klasserna som laddas av dess överordnade ClassLoaders, men vice versa är inte sant. Så de klasser som laddas av Application ClassLoader har synlighet i de klasser som laddas av Extension och Bootstrap ClassLoader.

Om vi ​​till exempel har två klasser: A & B, antar att klass A laddas av Application ClassLoader och class B laddas av Extensions ClassLoader. Här är klass A och B synliga för alla de klasser som laddas av Application ClassLoader, men klass B är endast synlig för de klasser som laddas av Extension ClassLoader.

Om du försöker ladda dessa klasser med Bootstrap ClassLoader ser du också java.lang.ClassNotFoundException . undantag.

Okej, nu när du känner till typerna av ClassLoaders och principerna bakom det, låt oss titta på några viktiga metoderfrån java.lang.ClassLoader klass.

Metoder för ClassLoader i Java

Få väsentliga av ClassLoader är följande:

loadClass (Strängnamn, boolsk upplösning)

Denna metod är ingångspunkten för ClassLoader och används för att ladda den klass som JVM refererar till. Det tar namnet på som en parameter. JVM åberopar metoden loadClass () för att lösa klassreferenser genom att ställa in det booleska värdet till true. Endast om vi behöver avgöra om klassen existerar eller inte, är den booleska parametern inställd på falsk.

Deklaration:

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

defineClass ()

En slutlig metod som används för att definiera en rad byte som en förekomst av en klass. Om klassen är ogiltig, kastar den en ClassFormatError.

Deklaration:

skyddad slutlig klass definiera klass (strängnamn, byte [] b, int av, int len) kastar ClassFormatError

findClass (strängnamn)

Metoden findClass används för att hitta den angivna klassen. Så den hittar bara klassen med ett fullständigt kvalificerat namn som parameter men laddar inte klassen. Metoden loadClass () anropar den här metoden om överordnad ClassLoader inte kan hitta den begärda klassen. Dessutom, om ingen förälder till ClassLoader hittar klassen, kastar standardimplementeringen a ClassNotFoundException.

Deklaration:

skyddad klass findClass (strängnamn) kastar ClassNotFoundException

Class.forName (Strängnamn, boolesk initialisering, ClassLoader-laddare)

Denna metod används för att ladda och initialisera klassen. Det ger ett alternativ att välja någon av ClassLoaders och ange att ClassLoader-parametern är NULL och sedan automatiskt används Bootstrap ClassLoader.

Deklaration:

public static Class forName (String name, boolean initialize, ClassLoader loader) kastar ClassNotFoundException

getParent ()

Metoden getParent används för att returnera den överordnade ClassLoader för delegering.

Deklaration:

allmän final ClassLoader getParent ()

getResource ()

Som namnet antyder försökte metoden getResource () att hitta en resurs med det angivna namnet. Den kommer först att delegera begäran till den överordnade ClassLoader för resursen. Om föräldern är noll söks sökvägen till ClassLoader inbyggd i JVM. Om detta misslyckas, anropar metoden findResource (String) för att hitta resursen, där resursnamnet anges som en ingång som kan vara antingen den absoluta eller relativa klassvägen. Sedan returnerar det ett URL-objekt för att läsa resursen eller returnerar ett nullvärde om resursen inte har tillräckliga behörigheter för att returnera resursen eller inte hittas.

Deklaration:

offentlig URL getResource (strängnamn)

Därefter, i den här artikeln om ClassLoader i Java, låt oss förstå Custom ClassLoader.

Anpassad ClassLoader i Java

De inbyggda ClassLoaders tar hand om de flesta fall där filerna redan finns i filsystemet, men om du vill ladda klasserna från den lokala hårddisken måste du använda anpassade ClassLoaders.

Skapa anpassad ClassLoader

För att skapa en anpassad ClassLoader måste du utöka ClassLoader klass och åsidosätta findClass () metod:

Exempel: Låt oss skapa en anpassad ClassLoader som utökar standard ClassLoader och laddar en byte-array från den angivna filen. Se koden nedan.

paket edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class Exempel utökar ClassLoader {@Override public Class findClass (String samplename) kastar 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 [] buffert ByteArrayOutputStream bStream = ny ByteArrayOutputStream () int nextValue = 0 försök {medan ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} fånga (IOException e) {e.printStackTrace ()} buffert = bStream.toByteArray () returbuffert}}

Med detta kommer vi till ett slut på den här artikeln om ClassLoader i Java. Jag hoppas att du förstod vad som är ClassLoaders i Java, dess metoder, de olika typerna av ClassLoaders etc.

Om du hittade den här artikeln om ”ClassLoader i Java”, kolla in av Edureka, ett pålitligt inlärningsföretag online med ett nätverk av mer än 250 000 nöjda elever spridda över hela världen. Vi är här för att hjälpa dig med varje steg på din resa, för att bli en förutom de här Java-intervjufrågorna, kommer vi med en läroplan som är utformad för studenter och yrkesverksamma som vill vara en Java Utvecklaren.

matris av klassobjekt java

Har du en fråga till oss? Vänligen nämna det i kommentarsektionen i denna “ClassLoader i Java ' så återkommer vi så snart som möjligt.