Care este rolul unui ClassLoader în Java?



Acest articol este un ghid cuprinzător despre modul în care funcționează ClassLoader în Java. Se discută despre tipurile, principiile și metodele ClassLoader în Java.

În timp ce lucrăm în Java, folosim adesea un număr mare de clase. Aceste clase Java nu sunt încărcate simultan în memorie, ci sunt încărcate atunci când este cerută de o aplicație. Aici intră în imagine Java ClassLoaders. Deci, în acest articol, voi discuta despre modul de utilizare a ClassLoader în Java împreună cu exemple.

Următoarele subiecte vor fi tratate în acest articol:





  1. Ce este ClassLoader?
  2. Tipuri de ClassLoader
  3. Principiile ClassLoader
  4. Metode ale ClassLoader
  5. Custom ClassLoader

Să începem!

Ce este ClassLoader în Java?

ClassLoader în Java este apelat de Java Runtime Environment pentru a încărca dinamic clasele ori de câte ori este cerut de aplicație în Mașină virtuală Java . Întrucât ClassLoaders face parte din Java Runtime Environment, mașina virtuală Java nu va avea nicio idee despre fișierele și sistemele de fișiere care stau la baza lor.



Acum, să înțelegem diferitele tipuri de ClassLoaders încorporate în Java.

Tipuri de ClassLoader în Java

Diferitele tipuri de ClassLoaders în Java sunt după cum urmează:

Să discutăm pe fiecare dintre ele unul câte unul.



Extensie ClassLoader

După cum sugerează și numele, Extension ClassLoader încarcă extensiile claselor Java de bază din JDK Biblioteca de extensii. Este un copil al Bootstrap ClassLoader și încarcă extensiile din directorul JRE / lib / text sau din orice alt director specificat în proprietatea sistemului java.ext.dirs.

Aplicație sau System ClassLoader

Aplicația sau Sistemul ClassLoader este un copil al Extensiei ClassLoader. Acest tip de ClassLoader încarcă toate clasele la nivel de aplicație găsite în opțiunea -cp din linia de comandă sau în variabila de mediu CLASSPATH.

administrator certificat cloudera pentru apache hadoop

Bootstrap ClassLoader

După cum știm cu toții asta Cursuri Java sunt încărcate de o instanță de java.lang.ClassLoade. Dar, deoarece ClassLoaders sunt clase, Bootstrap ClassLoader este responsabil pentru încărcarea claselor interne JDK. BootStrap ClassLoader este un cod de mașină care pornește operațiunea când JVM o apelează și încarcă clasele din rt.jar. Deci, puteți înțelege că Bootstrap ClassLoader servește nu are ClassLoader părinte și este astfel cunoscut sub numele de Primordial ClassLoader.

Notă: Prioritatea Bootstrap este mai mare decât Extension, iar prioritatea acordată Extension ClassLoader este mai mare decât Application ClassLoader. Consultați imaginea de mai jos:

Tipuri de ClassLoader - ClassLoader în Java - Edureka

În continuare, în acest articol, să înțelegem principiile pe care funcționează ClassLoader.

Principiile ClassLoader în Java

Setul de reguli pe baza căruia funcționează Java ClassLoader sunt următoarele trei principii:

Să le înțelegem pe fiecare.

Proprietatea unicității

Această proprietate asigură faptul că nu există repetarea claselor și că toate clasele sunt unice. Proprietatea unicitate asigură, de asemenea, că clasele sunt încărcate de ClassLoader părinte și nu sunt încărcate de ClassLoader copil. Într-un scenariu, în care părinții ClassLoader nu pot găsi clasa, atunci instanța curentă va încerca să o facă singură.

Model de delegare

ClassLoader în Java funcționează pe baza setului de operații date de modelul de delegare. Deci, ori de câte ori este generată o cerere pentru a găsi o clasă sau o resursă, atunci o instanță ClassLoader va delega căutarea clasei sau a resursei către ClassLoader părinte.

Setul de operații pe baza căruia funcționează ClassLoader sunt următoarele:

  • Mașina virtuală Java verifică dacă clasa este încărcată sau nu, ori de câte ori se întâlnește cu o clasă.
  • În cazul în care se încarcă clasa JVM continuă cu executarea clasei, dar într-un scenariu în care clasa nu este încărcată, atunciJVM solicită subsistemului Java ClassLoader să încarce clasa respectivă. După aceea, subsistemul ClassLoader oferă controlul Application ClassLoader.
  • Aplicația ClassLoader deleagă apoi solicitarea către Extension ClassLoader, care ulterior trece solicitarea către Bootstrap ClassLoader.
  • Acum, Bootstrap ClassLoader caută înBootstrap classpath pentru a verifica dacă clasa este disponibilă sau nu. Dacă clasa este disponibilă, atunci este încărcată, altfel cererea este din nou transmisă către Extension ClassLoader.
  • Extensia ClassLoader verifică clasa din extensia classpath.Dacă clasa este disponibilă, atunci este încărcată, altfel cererea este din nou transmisă către Application ClassLoader.
  • În cele din urmă, Application ClassLoader caută clasa în aplicația classpath.Dacă clasa este disponibilă, atunci este încărcată, altfel veți vedea o excepție de la ClassNotFoundException.

Consultați imaginea de mai jos.

funcția de sortare c ++

Principiul vizibilității

Conform acestui principiu, clasele pentru copii sunt vizibile pentru clasele încărcate de ClassLoaders părinte, dar viceversa nu este adevărat. Deci, clasele încărcate de Application ClassLoader au vizibilitate în clasele încărcate de Extension și Bootstrap ClassLoader.

De exemplu, dacă avem două clase: A & B, presupunem că clasa A este încărcată de Application ClassLoader și clasa B este încărcată de Extensions ClassLoader. Aici, clasele A și B sunt vizibile pentru toate acele clase încărcate de Application ClassLoader, dar clasa B este vizibilă doar pentru acele clase încărcate de Extension ClassLoader.

De asemenea, dacă încercați să încărcați aceste clase folosind Bootstrap ClassLoader, veți vedea java.lang.ClassNotFoundException . excepție.

Bine, acum că cunoașteți tipurile de ClassLoaders și principiile din spatele acestuia, permiteți-ne să analizăm câteva metode importantede la java.lang.ClassLoader clasă.

Metode de ClassLoader în Java

Puțini esențiali din ClassLoader sunt după cum urmează:

loadClass (numele șirului, rezolvare booleană)

Această metodă este punctul de intrare al ClassLoader și este utilizată pentru a încărca clasa la care face referire JVM. Se ia numele de ca parametru. JVM invocă metoda loadClass () pentru a rezolva referințele clasei setând valoarea booleană la true. Numai dacă trebuie să stabilim dacă clasa există sau nu, parametrul boolean este setat la fals.

Declaraţie:

public Class loadClass (numele șirului, rezolvare booleană) aruncă ClassNotFoundException {

defineClass ()

O metodă finală utilizată pentru a defini o matrice de octeți ca instanță a unei clase. În cazul în care clasa este nevalidă, atunci aruncă un ClassFormatError.

Declaraţie:

Clasa finală protejată defineClass (String name, byte [] b, int off, int len) aruncă ClassFormatError

findClass (numele șirului)

Metoda findClass este utilizată pentru a găsi clasa specificată. Deci, găsește clasa cu un nume complet calificat ca parametru, dar nu încarcă clasa. Metoda loadClass () invocă această metodă dacă ClassLoader părinte nu poate găsi clasa solicitată. De asemenea, dacă niciun părinte al ClassLoader nu găsește clasa, implementarea implicită aruncă o ClassNotFoundException.

Declaraţie:

Clasa protejată findClass (String name) aruncă ClassNotFoundException

Class.forName (numele șirului, inițializare booleană, încărcător ClassLoader)

Această metodă este utilizată pentru a încărca și inițializa clasa. Oferă opțiunea de a alege oricare dintre ClassLoaders și de a include parametrul ClassLoader este NULL, apoi automat este utilizat Bootstrap ClassLoader.

Declaraţie:

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

getParent ()

Metoda getParent este utilizată pentru a returna ClassLoader părinte pentru delegare.

Declaraţie:

public final ClassLoader getParent ()

getResource ()

După cum sugerează și numele, metoda getResource () a încercat să găsească o resursă cu numele dat. Acesta va delega inițial cererea către ClassLoader părinte pentru resursă. În cazul în care părintele este nul, atunci se caută calea ClassLoader încorporată în JVM. Acum, dacă acest lucru eșuează, atunci metoda va invoca findResource (String) pentru a găsi resursa, unde numele resursei este specificat ca o intrare care poate fi calea absolută sau relativă. Apoi, returnează un obiect URL pentru citirea resursei sau returnează o valoare nulă dacă resursa nu are privilegii adecvate pentru a returna resursa sau nu este găsită.

Declaraţie:

URL public getResource (numele șirului)

Apoi, în acest articol despre ClassLoader în Java, permiteți-ne să înțelegem Custom ClassLoader.

Custom ClassLoader în Java

ClassLoaders încorporat se va ocupa de majoritatea cazurilor în care fișierele sunt deja în sistemul de fișiere, dar dacă doriți să încărcați clasele de pe hard disk-ul local, atunci trebuie să utilizați ClassLoaders personalizate.

Creați ClassLoader personalizat

Pentru a crea un ClassLoader personalizat, trebuie să extindeți ClassLoader clasa și suprascrie findClass () metodă:

Exemplu: Să creăm un ClassLoader personalizat care extinde ClassLoader implicit și încarcă o matrice de octeți din fișierul specificat. Consultați codul de mai jos.

pachet edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class Sample extinde ClassLoader {@Override public Class findClass (String samplename) throws ClassNotFoundException {byte [] b = customLo (samplename) return defineClass (samplename, b, 0, b.length)} octet privat [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('. separatorChar) + '.class') byte [] buffer ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () return buffer}}

Cu aceasta, ajungem la sfârșitul acestui articol despre ClassLoader în Java. Sper că ați înțeles ce sunt ClassLoaders în Java, metodele sale, diferitele tipuri de ClassLoaders etc.

Dacă ați găsit acest articol despre „ClassLoader în Java”, consultați de Edureka, o companie de învățare online de încredere, cu o rețea de peste 250.000 de elevi mulțumiți răspândiți pe tot globul. Suntem aici pentru a vă ajuta cu fiecare pas din călătoria dvs., pentru a deveni un afară de întrebările java de interviu, venim cu un curriculum care este conceput pentru studenți și profesioniști care doresc să fie un Java Dezvoltator.

așteptați și anunțați în java

Ai o întrebare pentru noi? Vă rugăm să o menționați în secțiunea de comentarii a acestui „ClassLoader în Java ' și ne vom contacta cât mai curând posibil.