Wat is de rol van een ClassLoader in Java?



Dit artikel is een uitgebreide gids over hoe de ClassLoader werkt in Java. Het bespreekt de typen, principes en methoden van ClassLoader in Java.

Tijdens het werken in Java gebruiken we vaak een groot aantal klassen. Deze Java-klassen worden niet allemaal tegelijk in het geheugen geladen, maar worden geladen wanneer een toepassing dit vereist. Dit is waar Java ClassLoaders in beeld komen. Dus in dit artikel zal ik bespreken hoe ik de ClassLoader in Java kan gebruiken, samen met voorbeelden.

In dit artikel komen de volgende onderwerpen aan bod:





  1. Wat is ClassLoader?
  2. Soorten ClassLoader
  3. Principes van ClassLoader
  4. Methoden van ClassLoader
  5. Aangepaste ClassLoader

Laten we beginnen!

Wat is ClassLoader in Java?

ClassLoader in Java wordt aangeroepen door de Java Runtime Environment om de klassen dynamisch te laden wanneer dit door de toepassing in de Java virtuele machine . Aangezien ClassLoaders een onderdeel zijn van de Java Runtime Environment, heeft de Java Virtual Machine geen idee van de onderliggende bestanden en bestandssystemen.



Laten we nu de verschillende soorten ingebouwde ClassLoaders in Java begrijpen.

Typen ClassLoader in Java

De verschillende soorten ClassLoaders in Java zijn als volgt:

Laten we ze allemaal een voor een bespreken.



Extensie ClassLoader

Zoals de naam al doet vermoeden, laadt de Extension ClassLoader de extensies van de Java-kernklassen vanuit de JDK Extensie bibliotheek. Het is een kind van de Bootstrap ClassLoader en laadt de extensies uit de JRE / lib / text directory of een andere directory gespecificeerd in de java.ext.dirs systeemeigenschap.

Toepassing of systeem ClassLoader

De toepassing of de systeem ClassLoader is een kind van de extensie ClassLoader. Dit type ClassLoader laadt alle toepassingsniveauklassen die te vinden zijn in de opdrachtregeloptie -cp of in de omgevingsvariabele CLASSPATH.

Bootstrap ClassLoader

Zoals we allemaal weten Java-klassen worden geladen door een instantie van java.lang.ClassLoade. Maar aangezien ClassLoaders klassen zijn, is de Bootstrap ClassLoader verantwoordelijk voor het laden van de interne JDK-klassen. BootStrap ClassLoader is een machinecode die de bewerking start wanneer JVM deze aanroept en de klassen laadt vanuit rt.jar. U kunt dus begrijpen dat de Bootstrap ClassLoader-service geen bovenliggende ClassLoader heeft en daarom bekend staat als Primordial ClassLoader.

Opmerking: De prioriteit van Bootstrap is hoger dan Extension, en de prioriteit die wordt gegeven aan de Extension ClassLoader is hoger dan die van Application ClassLoader. Raadpleeg de onderstaande afbeelding:

Soorten ClassLoader - ClassLoader in Java - Edureka

Laten we vervolgens in dit artikel de principes begrijpen waarop de ClassLoader werkt.

Principes van ClassLoader in Java

De set regels op basis waarvan de Java ClassLoader werkt, zijn de volgende drie principes:

Laten we ze allemaal begrijpen.

Uniek eigendom

Deze eigenschap zorgt ervoor dat er geen herhaling van klassen plaatsvindt en dat alle klassen uniek zijn. De eigenschap uniqueness zorgt er ook voor dat klassen worden geladen door de bovenliggende ClassLoader en niet door de onderliggende ClassLoader. In een scenario waarin de bovenliggende ClassLoader de klasse niet kan vinden, zal het huidige exemplaar proberen het zelf te doen.

Delegatiemodel

ClassLoader in Java werkt op basis van de reeks bewerkingen die door het delegatiemodel worden gegeven. Dus wanneer een verzoek wordt gegenereerd om een ​​klasse of een bron te vinden, delegeert een ClassLoader-instantie het zoeken naar de klasse of de bron aan de bovenliggende ClassLoader.

wat zit erin__

De reeks bewerkingen op basis waarvan de ClassLoader werkt, is als volgt:

  • De Java Virtual Machine controleert of de klasse is geladen of niet, wanneer deze een klasse tegenkomt.
  • In het geval dat de klasse is geladen JVM gaat verder met de uitvoering van de klasse, maar in een scenario waarin de klasse niet is geladenJVM vraagt ​​het Java ClassLoader-subsysteem om die bepaalde klasse te laden. Daarna geeft het ClassLoader-subsysteem de controle over de Application ClassLoader.
  • De Application ClassLoader delegeert het verzoek vervolgens aan de Extension ClassLoader, die het verzoek daarna doorgeeft aan de Bootstrap ClassLoader.
  • Nu zoekt de Bootstrap ClassLoader in hetBootstrap classpath om te controleren of de class beschikbaar is of niet. Als de klasse beschikbaar is, wordt deze geladen, anders wordt het verzoek opnieuw doorgegeven aan de extensie ClassLoader.
  • De Extension ClassLoader controleert de klasse in het extensie classpath.Als de klasse beschikbaar is, wordt deze geladen, anders wordt de aanvraag opnieuw doorgegeven aan de Application ClassLoader.
  • Ten slotte zoekt de Application ClassLoader naar de klasse in het klassepad van de toepassing.Als de klasse beschikbaar is, wordt deze geladen, anders ziet u een uitzondering van ClassNotFoundException.

Raadpleeg de onderstaande afbeelding.

Zichtbaarheidsprincipe

Volgens dit principe zijn de klassen van de kinderen zichtbaar voor de klassen die worden geladen door de bovenliggende ClassLoaders, maar het omgekeerde is niet waar. De klassen die door de Application ClassLoader zijn geladen, hebben dus zicht op de klassen die door de Extension en Bootstrap ClassLoader zijn geladen.

Als we bijvoorbeeld twee klassen hebben: A & B, neem dan aan dat klasse A wordt geladen door de Application ClassLoader en klasse B wordt geladen door de Extensions ClassLoader. Hier zijn de klassen A en B zichtbaar voor al die klassen die zijn geladen door de Application ClassLoader, maar klasse B is alleen zichtbaar voor die klassen die zijn geladen door de Extension ClassLoader.

Als u deze klassen probeert te laden met de Bootstrap ClassLoader, ziet u ook het java.lang.ClassNotFoundException . uitzondering.

Oké, nu je de soorten ClassLoaders kent en de principes erachter, laten we eens kijken naar een paar belangrijke methodenvan de java.lang.ClassLoader klasse.

Methoden van ClassLoader in Java

Weinig essentieel van ClassLoader zijn als volgt:

loadClass (String naam, booleaanse oplossing)

Deze methode is het startpunt van de ClassLoader en wordt gebruikt om de klasse te laden waarnaar wordt verwezen door de JVM. Het neemt de naam van de als parameter. De JVM roept de methode loadClass () aan om de klasseverwijzingen op te lossen door de booleaanse waarde in te stellen op true. Alleen als we moeten bepalen of de klasse bestaat of niet, wordt de parameter boolean ingesteld op false.

Verklaring:

public Class loadClass (String naam, booleaanse oplossing) gooit ClassNotFoundException {

defineClass ()

Een laatste methode die wordt gebruikt om een ​​array van bytes te definiëren als een instantie van een klasse. Als de klasse ongeldig is, wordt er een ClassFormatError gegenereerd.

Verklaring:

beschermde laatste Klasse defineClass (String naam, byte [] b, int uit, int len) gooit ClassFormatError

findClass (String naam)

De methode findClass wordt gebruikt om de opgegeven klasse te vinden. Het vindt dus gewoon de klasse met een volledig gekwalificeerde naam als parameter, maar laadt de klasse niet. De methode loadClass () roept deze methode aan als de bovenliggende ClassLoader de gevraagde klasse niet kan vinden. Als geen ouder van de ClassLoader de klasse vindt, gooit de standaardimplementatie een ClassNotFoundException.

Verklaring:

protected Class findClass (String naam) gooit ClassNotFoundException

Class.forName (Stringnaam, boolean initialiseren, ClassLoader-lader)

Deze methode wordt gebruikt om de klasse te laden en te initialiseren. Het geeft een optie om een ​​van de ClassLoaders te kiezen en als de ClassLoader-parameter NULL is, wordt automatisch de Bootstrap ClassLoader gebruikt.

Verklaring:

openbare statische Class forName (String name, boolean initialize, ClassLoader loader) gooit ClassNotFoundException

getParent ()

De methode getParent wordt gebruikt om de bovenliggende ClassLoader te retourneren voor delegatie.

Verklaring:

openbare laatste ClassLoader getParent ()

getResource ()

Zoals de naam doet vermoeden, heeft de methode getResource () geprobeerd een bron met de opgegeven naam te vinden. Het zal in eerste instantie het verzoek naar de bovenliggende ClassLoader voor de bron delegeren. Als de ouder nul is, wordt het pad van ClassLoader dat in de JVM is ingebouwd, doorzocht. Als dit nu niet lukt, roept de methode de findResource (String) aan om de resource te vinden, waarbij de resourcenaam wordt gespecificeerd als een invoer die het absolute of relatieve klassepad kan zijn. Vervolgens wordt een URL-object geretourneerd voor het lezen van de bron of wordt een nulwaarde geretourneerd als de bron niet de juiste rechten heeft om de bron te retourneren of niet wordt gevonden.

Verklaring:

openbare URL getResource (tekenreeksnaam)

Laten we vervolgens in dit artikel over ClassLoader in Java de Custom ClassLoader begrijpen.

Aangepaste ClassLoader in Java

De ingebouwde ClassLoaders zorgen voor de meeste gevallen waarin de bestanden zich al in het bestandssysteem bevinden, maar als u de klassen van de lokale harde schijf wilt laden, moet u gebruik maken van aangepaste ClassLoaders.

Maak een aangepaste ClassLoader

Om een ​​aangepaste ClassLoader te maken, moet u de extensie ClassLoader class en overschrijf de findClass () methode:

Voorbeeld: Laten we een aangepaste ClassLoader maken die de standaard ClassLoader uitbreidt en een byte-array uit het opgegeven bestand laadt. Raadpleeg de onderstaande code.

klasse versus interface in java
pakket edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream openbare klasse Sample breidt ClassLoader uit {@Override public Class findClass (String samplename) gooit ClassNotFoundException {byte [] b = customLoadClass (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 = nieuwe ByteArrayOutputStream () int nextValue = 0 probeer {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () retourbuffer}}

Hiermee komen we een einde aan dit artikel over ClassLoader in Java. Ik hoop dat je hebt begrepen wat ClassLoaders in Java zijn, de methoden, de verschillende soorten ClassLoaders, enz.

Als je dit artikel over 'ClassLoader in Java' hebt gevonden, bekijk dan het door Edureka, een vertrouwd online leerbedrijf met een netwerk van meer dan 250.000 tevreden leerlingen verspreid over de hele wereld. We zijn hier om je te helpen bij elke stap op je reis, om naast deze Java-interviewvragen een curriculum te worden dat is ontworpen voor studenten en professionals die een Java Ontwikkelaar.

Heeft u een vraag voor ons? Vermeld het alstublieft in het commentaargedeelte van deze “ClassLoader in Java ' en we nemen zo snel mogelijk contact met u op.