I ClassLoaders sono fondamentalmente gli elementi che danno significato alle classi nella JVM. Formano una gerarchia per cui la radice si trova nella JVM e carica le classi java. ApplicationClassLoader è il primo ClassLoader che devi considerare, poiché carica tutte le classi della tua applicazione.
Quando una classe viene caricata, tutti i suoi riferimenti ad altre classi vengono risolti e queste classi vengono caricate. La JVM fornisce di default un sistema dove i classloader chiedono ai loro genitori prima di vedere se hanno già caricato una classe. In caso contrario, cercano nel classpath
Due classi possono essere isolate se vivono in 2 diversi classloader e non nel classloader dell'app. Non è difficile da fare. Devi solo creare un classloader (come URLClassLoader) specificando il suo genitore e il suo classpath (il luogo in cui è presente il bytecode)
quindi, gli dici di caricare una classe. Chiederà al genitore, e se la classe non è ancora stata caricata, cercherà il suo classpath e lo caricherà. Se crei un altro classloader collegato allo stesso genitore, le classi caricate dal primo non saranno mai viste dai secondi come se fossero fratelli. E la seconda lattina carica una classe con lo stesso nome senza alcun problema
Questo è abbastanza un buon isolamento
app server utilizzare un'altra forma di delega di avere un isolamento franca tra le applicazioni. ridefiniscono un classloader che si estende, per esempio, URLClassLoader e invertire il processo di delega da parte di iniziare a cercare le classi nel loro percorso di classe prima, poi chiedere al genitore
Prendo queste due classi non in spazi dei nomi separati? –
Non capisco cosa significhi "spazio dei nomi" nel contesto di Java. Un nome di pacchetto? Lascia che siano in pacchetti diversi se è importante. – Nulldevice
Scusa, sì, intendevo pacchetti. Inoltre, ho letto male la tua domanda, quindi non penso sia pertinente! –