Qual è il ruolo di un ClassLoader in Java?



Questo articolo è una guida completa su come funziona ClassLoader in Java. Discute i tipi, i principi e i metodi di ClassLoader in Java.

Mentre lavoriamo in Java, usiamo spesso un gran numero di classi. Queste classi Java non vengono caricate tutte in una volta nella memoria, ma vengono caricate quando richiesto da un'applicazione. È qui che entrano in gioco i Java ClassLoaders. Quindi in questo articolo, parlerò di come utilizzare ClassLoader in Java insieme agli esempi.

I seguenti argomenti verranno trattati in questo articolo:





  1. Cos'è ClassLoader?
  2. Tipi di ClassLoader
  3. Principi di ClassLoader
  4. Metodi di ClassLoader
  5. ClassLoader personalizzato

Cominciamo!

Cos'è ClassLoader in Java?

ClassLoader in Java viene chiamato da Java Runtime Environment per caricare dinamicamente le classi ogni volta che è richiesto dall'applicazione nel macchina virtuale Java . Poiché i ClassLoader fanno parte del Java Runtime Environment, la Java Virtual Machine non avrà alcuna idea dei file e dei file system sottostanti.



Ora, cerchiamo di capire i diversi tipi di ClassLoader incorporati in Java.

Tipi di ClassLoader in Java

I diversi tipi di ClassLoader in Java sono i seguenti:

Parliamo di ciascuno di essi uno per uno.



Estensione ClassLoader

Come suggerisce il nome, Extension ClassLoader carica le estensioni delle classi Java principali dal file JDK Libreria di estensioni. È un figlio di Bootstrap ClassLoader e carica le estensioni dalla directory JRE / lib / text o da qualsiasi altra directory specificata nella proprietà di sistema java.ext.dirs.

Application o System ClassLoader

L'applicazione o il sistema ClassLoader è un figlio di Extension ClassLoader. Questo tipo di ClassLoader carica tutte le classi a livello di applicazione trovate nell'opzione della riga di comando -cp o nella variabile d'ambiente CLASSPATH.

Bootstrap ClassLoader

Come lo sappiamo tutti Classi Java vengono caricati da un'istanza di java.lang.ClassLoade. Tuttavia, poiché i ClassLoader sono classi, Bootstrap ClassLoader è responsabile del caricamento delle classi interne JDK. BootStrap ClassLoader è un codice macchina che avvia l'operazione quando JVM lo chiama e carica le classi da rt.jar. Quindi, puoi capire che Bootstrap ClassLoader non ha un ClassLoader genitore ed è quindi noto come Primordial ClassLoader.

Nota: La priorità di Bootstrap è superiore a Extension e la priorità assegnata a Extension ClassLoader è superiore a Application ClassLoader. Fare riferimento all'immagine sottostante:

Tipi di ClassLoader - ClassLoader in Java - Edureka

Successivamente in questo articolo, cerchiamo di comprendere i principi su cui funziona ClassLoader.

Principi di ClassLoader in Java

L'insieme di regole in base alle quali funziona Java ClassLoader sono i seguenti tre principi:

Cerchiamo di capire ognuno di loro.

java dichiara un array di oggetti

Proprietà di unicità

Questa proprietà garantisce che non vi siano ripetizioni di classi e che tutte le classi siano univoche. La proprietà di unicità assicura inoltre che le classi vengano caricate dal ClassLoader padre non vengano caricate dal ClassLoader figlio. In uno scenario in cui il ClassLoader padre non riesce a trovare la classe, l'istanza corrente tenterà di farlo da sola.

Modello di delega

ClassLoader in Java funziona in base alla serie di operazioni fornite dal modello di delega. Pertanto, ogni volta che viene generata una richiesta per trovare una classe o una risorsa, un'istanza di ClassLoader delegherà la ricerca della classe o della risorsa al ClassLoader padre.

La serie di operazioni in base alle quali funziona ClassLoader sono le seguenti:

  • La Java Virtual Machine controlla se la classe è caricata o meno, ogni volta che incontra una classe.
  • Nel caso in cui venga caricata la classe JVM procede con l'esecuzione della classe, ma in uno scenario in cui la classe non viene caricata, quindiJVM chiede al sottosistema Java ClassLoader di caricare quella particolare classe. Successivamente, il sottosistema ClassLoader dà il controllo a Application ClassLoader.
  • L'Application ClassLoader delega quindi la richiesta all'Extension ClassLoader, che in seguito passa la richiesta al Bootstrap ClassLoader.
  • Ora, Bootstrap ClassLoader cerca nel fileBootstrap classpath per verificare se la classe è disponibile o meno. Se la classe è disponibile, viene caricata, altrimenti la richiesta viene nuovamente passata a Extension ClassLoader.
  • Extension ClassLoader verifica la classe nel classpath dell'estensione.Se la classe è disponibile, viene caricata, altrimenti la richiesta viene nuovamente passata all'Application ClassLoader.
  • Infine, Application ClassLoader cerca la classe nel classpath dell'applicazione.Se la classe è disponibile, viene caricata, altrimenti vedrai un'eccezione di ClassNotFoundException.

Fare riferimento all'immagine sottostante.

Principio di visibilità

In base a questo principio, le classi dei bambini sono visibili alle classi caricate dai suoi ClassLoader principali, ma il contrario non è vero. Quindi, le classi caricate da Application ClassLoader hanno visibilità nelle classi caricate da Extension e Bootstrap ClassLoader.

Ad esempio, se abbiamo due classi: A e B, supponiamo che la classe A venga caricata dall'Application ClassLoader e la classe B sia caricata dall'Extensions ClassLoader. Qui, le classi A e B sono visibili a tutte quelle classi caricate da Application ClassLoader, ma la classe B è visibile solo a quelle classi caricate da Extension ClassLoader.

Inoltre, se provi a caricare queste classi usando Bootstrap ClassLoader, vedrai il file java.lang.ClassNotFoundException . eccezione.

Bene, ora che conosci i tipi di ClassLoader e i principi alla base, esaminiamo alcuni metodi importantidal java.lang.ClassLoader classe.

Metodi di ClassLoader in Java

Pochi essenziali di ClassLoader sono i seguenti:

loadClass (nome stringa, risoluzione booleana)

Questo metodo è il punto di ingresso di ClassLoader e viene utilizzato per caricare la classe a cui fa riferimento la JVM. Prende il nome di come parametro. La JVM richiama il metodo loadClass () per risolvere i riferimenti alla classe impostando il valore booleano su true. Solo se dobbiamo determinare se la classe esiste o meno, il parametro booleano viene impostato su false.

Dichiarazione:

public Class loadClass (nome stringa, risoluzione booleana) genera ClassNotFoundException {

defineClass ()

Un metodo finale utilizzato per definire un array di byte come istanza di una classe. Nel caso in cui la classe non sia valida, genera un'eccezione ClassFormatError.

Dichiarazione:

protected final Class defineClass (String name, byte [] b, int off, int len) genera ClassFormatError

findClass (nome stringa)

Il metodo findClass viene utilizzato per trovare la classe specificata. Quindi, trova solo la classe con un nome completo come parametro ma non carica la classe. Il metodo loadClass () richiama questo metodo se il genitore ClassLoader non riesce a trovare la classe richiesta. Inoltre, se nessun genitore di ClassLoader trova la classe, l'implementazione predefinita genera un file ClassNotFoundException.

Dichiarazione:

protected Class findClass (String name) genera ClassNotFoundException

Class.forName (nome stringa, inizializzazione booleana, caricatore ClassLoader)

Questo metodo viene utilizzato per caricare e inizializzare la classe. Offre un'opzione per scegliere uno qualsiasi dei ClassLoader e nel caso in cui il parametro ClassLoader sia NULL, quindi automaticamente viene utilizzato il Bootstrap ClassLoader.

Dichiarazione:

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

getParent ()

Il metodo getParent viene utilizzato per restituire il ClassLoader padre per la delega.

Dichiarazione:

public final ClassLoader getParent ()

getResource ()

Come suggerisce il nome, il metodo getResource () ha cercato di trovare una risorsa con il nome dato. Inizialmente delegherà la richiesta al ClassLoader padre per la risorsa. Nel caso in cui il genitore sia nullo, viene cercato il percorso di ClassLoader integrato nella JVM. Ora, se questo fallisce, il metodo richiamerà findResource (String) per trovare la risorsa, dove il nome della risorsa è specificato come input che può essere il classpath assoluto o relativo. Quindi, restituisce un oggetto URL per leggere la risorsa o restituisce un valore nullo se la risorsa non dispone di privilegi adeguati per restituire la risorsa o non viene trovata.

Dichiarazione:

URL pubblico getResource (nome stringa)

Successivamente, in questo articolo su ClassLoader in Java, comprendiamo il Custom ClassLoader.

ClassLoader personalizzato in Java

I ClassLoader integrati si prenderanno cura della maggior parte dei casi in cui i file si trovano già nel file system, ma se vuoi caricare le classi dal disco rigido locale, devi utilizzare ClassLoader personalizzati.

Crea ClassLoader personalizzato

Per creare un ClassLoader personalizzato, è necessario estendere il file ClassLoader class e sovrascrivere il findClass () metodo:

Esempio: creiamo un ClassLoader personalizzato che estende il ClassLoader predefinito e carica un array di byte dal file specificato. Fare riferimento al codice sottostante.

pacchetto edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class Sample extends ClassLoader {@Override public Class findClass (String samplename) genera ClassNotFoundException {byte [] b = customLoadClassFromFile (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 = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () return buffer}}

Con questo, arriviamo alla fine di questo articolo su ClassLoader in Java. Spero che tu abbia capito cosa sono i ClassLoader in Java, i suoi metodi, i diversi tipi di ClassLoader, ecc.

Se hai trovato questo articolo su 'ClassLoader in Java', controlla il da Edureka, una società di formazione online affidabile con una rete di oltre 250.000 studenti soddisfatti sparsi in tutto il mondo. Siamo qui per aiutarti in ogni fase del tuo viaggio, per diventare oltre a queste domande di intervista java, abbiamo creato un curriculum progettato per studenti e professionisti che vogliono essere un Giava Sviluppatore.

Hai domande per noi? Si prega di menzionarlo nella sezione commenti di questo 'ClassLoader in Java ' e ti risponderemo il prima possibile.