classloader in java è una classe stessa, quindi chi caricherà la classe classloader?


ClassLoader in Java è una classe che viene utilizzata per caricare file di classe in Java.

Il java.lang.ClassLoader è una classe astratta

Qui la mia domanda è fa questo java.lang.ClassLoader class è in qualsiasi modo correlato ai classloader di JVM(1. Bootstrap classe loader 2. Estensioni classe loader 3. Caricatore di classe di sistema)?

O questo java.lang.ClassLoader è una classe separata che può essere utilizzata per creare un classloader personalizzato?

I caricatori di classe sono la parte di Java Ambiente di runtime che carica dinamicamente le classi Java nella macchina virtuale Java. È responsabile dell'individuazione delle librerie, della lettura del contenuto e del caricamento delle classi contenute nelle librerie All'avvio di JVM vengono utilizzati tre caricatori di classe

  1. Caricamento di classe Bootstrap

  2. Estensioni class loader

  3. Caricatore di classe di sistema

Bootstrap class loader carica le librerie java di base. È scritto in codice nativo. Il bootstrap class loader è responsabile del caricamento delle classi java chiave come java.lang.Oggetto e altro codice di runtime in memoria. Le classi di runtime sono impacchettate all'interno jre/lib/rt.jar file.

Extensions class loader carica il codice nelle directory di estensione. È implementato dalla classe ExtClassLoader.

System class loader il codice trovato su java.classe.percorso che si associa alle variabili del percorso della classe di sistema. È implementato dalla classe AppClassLoader. Tutte le classi utente per impostazione predefinita sono caricati dal caricatore di classe di sistema.

Java ClassLoader è gerarchico e ogni volta che viene sollevata una richiesta per caricare una classe, la delega al suo genitore e in questo modo l'unicità viene mantenuta nell'ambiente di runtime. Se il caricatore di classe padre non trova la classe, il caricatore di classe stesso tenta di caricare la classe.

ciò significa che il primo caricatore di classe di sistema delegherà la richiesta alle estensioni caricatore di classe che delegherà la richiesta al caricatore di classe Bootstrap qui cercherà la classe se non trovata, quindi Extensions class loader cercherà la classe se non trovata, quindi System class loader cercherà la classe se non trovata, quindi lancia ClassNotFoundException

JVM inizia sempre con il caricatore di classe di sistema per la classe di caricamento?

Correggimi se sbaglio in qualsiasi punto

Author: JVM, 2017-11-16

1 answers

Il termine "System class loader" è un termine improprio. Come hai affermato correttamente, è responsabile del caricamento delle classi dalle posizioni del percorso della classe, che sono le classi application.

A partire da Java 8, entrambi, AppClassLoader e ExtClassLoader, sono sottoclassi di java.net.URLClassLoader, che è una sottoclasse di java.security.SecureClassLoader, che è una sottoclasse di java.lang.ClassLoader. Tutte queste classi vengono caricate dal caricatore Bootstrap, risolvendo il problema di pollo e uova.

Ogni classe di runtime ha una classe di definizione caricatore. Per le classi definite dal loader Bootstrap durante l'avvio, il loader di classe che definisce è il loader Bootstrap. Quando l'inizializzazione JVM è completata e viene effettuato un tentativo di avviare un'applicazione, il caricatore della classe dell'applicazione (ovvero il caricatore della classe di sistema) verrà interrogato per la classe principale. Il caricatore di classi di applicazioni seguirà il modello di delega standard interrogando prima il genitore, allo stesso modo il caricatore di classi di estensione e qualsiasi caricatore di classi creerà la classe sarà la classe ' defining class loader.

Ora, quando si risolve una classe a cui fa riferimento un'altra classe o quando viene invocato Class.forName(String), verrà utilizzato il caricatore di definizione della classe contenente il riferimento per risolvere la classe. Quindi, quando il caricatore della classe dell'applicazione ha caricato la tua classe myapp.foo.Bar e contiene un riferimento a javax.swing.JButton, il suo caricatore di classe che definisce, cioè il caricatore della classe dell'applicazione, verrà interrogato per quella classe, seguire il modello di delega per finire con un javax.swing.JButton definito dal Caricatore di bootstrap. Quindi i riferimenti di classe all'interno di javax.swing.JButton vengono risolti solo tramite il Bootstrap loader, il che implica che javax.swing.JButton non può contenere un riferimento alla classe myapp.foo.Bar, poiché non è nell'ambito.

Quindi, la JVMnon inizia sempre con "System class loader" per caricare una classe, ma solo per risolvere i riferimenti di classe delle classi definite da essa (o un caricatore figlio) o quando viene interrogato esplicitamente, come quando si risolve la classe principale.

Ci sono 3rd i caricatori di classe party non seguono rigorosamente il modello di delega padre, ma indipendentemente da come e a quale caricatore delegano, ci sarà un caricatore di definizione per ogni classe (quello restituito da getClassLoader()), che sarà quello utilizzato per risolvere i riferimenti all'interno della classe. La JVM garantisce che i nomi simbolici identici all'interno di una classe si risolvano sempre nella stessa classe di runtime, indipendentemente da come il particolare caricatore di classi implementa le ricerche.

Si noti che in Java 9, l'estensione class loader è stato sostituito dal Platform class loader. Questo caricatore di classi può deviare dalla semplice delega padre, ovvero potrebbe delegare al caricatore di classi di applicazioni per caricare i moduli forniti dall'applicazione che sostituiscono un modulo fornito dalla piattaforma. Inoltre, i caricatori di classe incorporati non sono più sottoclassi di URLClassLoader.

 3
Author: Holger, 2017-11-16 08:08:05