Pregunta
cuando se ejecuta JVM siguiente código
MyObject o=new MyObject() //first access MyObject
sabemos JVM a partir de la clase de carga MiObjeto, pero me pregunto cómo saben JVM MiObjeto no está cargado.
Motivación
Me pregunto para saber porque si JVM ejecuta estos códigos
public class Main{
public static void main(){
ClassLoader myLoader = new ClassLoader(null) {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// omitted here
}
}
myLoader.loadClass("MyObject"); //#1
MyObject o=new MyObject() //#2
}
}
que sabe que sin # 1, MiObjeto se cargará por el cargador de clase de la clase principal, pero con # 1, clase voluntad de MiObjeto cargamos en el # 2, y cómo JVM hace jueces?
Cada ClassLoader
mantiene una lista de las clases se ha cargado hasta el momento.
Si dos diferentes ClassLoader
clases de carga una del mismo nombre, éstos son tratados por el tiempo de ejecución como dos clases no relacionadas separadas. Esto es útil porque permite diferentes versiones de la misma clase que coexisten en tiempo de ejecución. Por ejemplo, podemos desplegar varias aplicaciones web desarrolladas por diferentes equipos en la misma JVM, cada uno con sus propias bibliotecas, liberando a los desarrolladores de las diversas aplicaciones de la coordinación de las versiones de las bibliotecas que utilizan.
En su caso, si lo hacemos new MyObject()
en clase Main
, el cargador de clases que clase cargada Main
se le pide que cargue clase MyObject
. Ese es el sistema ClassLoader
, que lo conocido nada de su myLoader
. Por lo tanto, el cargador de clases sistema cargará la clase MyObject
de nuevo.
Esto se puede comprobar mediante la adición de un inicializador estático a MiObjeto:
class MyObject {
static {
System.out.println("class MyObject has been loaded");
}
}