tutorial - java classloader example
¿Qué carga el cargador de clases del sistema java? (3)
Tldr:
§ .. el valor de esa propiedad se toma como el nombre de una clase que se devolverá como el cargador de clases del sistema. La clase se carga utilizando el cargador de clases del sistema predeterminado .
... Así, si su cargador de clases reemplaza a X como el cargador de clases del sistema, entonces el padre de su cargador de clases será X, el cargador de clases del sistema predeterminado.
(X es de un tipo como sun.misc.Launcher$AppClassLoader
).
Puede encontrar más información en docs.oracle.com - Cómo el iniciador de Java encuentra las clases :
El iniciador de Java, java, inicia la máquina virtual de Java. La máquina virtual busca y carga clases en este orden:
Clases de arranque : clases que comprenden la plataforma Java, incluidas las clases en rt.jar y varios otros archivos jar importantes.
Clases de extensión : clases que utilizan el mecanismo de extensión de Java. Estos se agrupan como archivos .jar ubicados en el directorio de extensiones.
Clases de usuario : clases definidas por desarrolladores y terceros que no aprovechan el mecanismo de extensión. Identifica la ubicación de estas clases utilizando la opción -classpath en la línea de comandos o utilizando la variable de entorno CLASSPATH.
Tsmr:
Podemos probar que X es realmente el padre de nuestro classloader :
/** run with -Djava.system.class.loader=MyCL to use this classloader */
public class MyCL extends ClassLoader {
public MyCL(ClassLoader parent) { // this constructor must be public, else IllegalAccessException
super(parent);
}
}
Este es nuestro código principal:
public class Main {
public static void main(String args[]) {
System.out.println("getSystemClassLoader(): " + ClassLoader.getSystemClassLoader());
ClassLoader cl = MyCL.class.getClassLoader();
System.out.println("Classloader of MyCL: " + cl);
Class type_of_cl = cl.getClass();
System.out.println("..and its type: " + type_of_cl);
ClassLoader cl_of_cl = class_of_cl.getClassLoader();
System.out.println("Classloader of (Classloader of MyCL): " + cl_of_cl);
}
}
Esta es la salida (en mi sistema) cuando se ejecuta con el comando java -Djava.system.class.loader=MyCL Main
(cf. Eclipse run config ):
getSystemClassLoader (): MyCL @ 1888759
Classloader of MyCL: sun.misc.Launcher$AppClassLoader@7fdcde
..y su tipo: class sun.misc.Launcher $ AppClassLoader
Classloader of (Classloader of MyCL): null
Podemos ver que el cargador de clases de sun.misc.Launcher$AppClassLoader
es sun.misc.Launcher$AppClassLoader
, que es el cargador de clases del sistema predeterminado.
(Según el lenguaje que se ve en la otra cita de Oracle anterior, el cargador de clases del sistema predeterminado también se llama el cargador de clases de " Clases de usuarios ". Atornille a Oracle para obtener 2 nombres para la misma cosa).
Sabemos que podemos anular el classloader del sistema con:
java -Djava.system.class.loader=com.test.MyClassLoader xxx
Entonces, dado que com.test.MyClassLoader
sí es una clase, ¿por quién se carga?
¿Cómo obtenemos el archivo de clase de este "meta" cargador de clases?
Desde el Javadoc para ClassLoader.getSystemClassLoader
:
Si la propiedad del sistema "java.system.class.loader" se define cuando se invoca este método por primera vez, se toma el valor de esa propiedad como el nombre de una clase que se devolverá como el cargador de clases del sistema. La clase se carga utilizando el cargador de clases del sistema predeterminado y debe definir un constructor público que tome un único parámetro de tipo ClassLoader que se usa como el padre de la delegación.
El propio cargador de clases del sistema predeterminado es específico para la implementación de JVM.
Bootstrap classloader
es el padre de todos los classloaders
de classloaders
y carga las clases JDK estándar en el directorio lib de JRE (rt.jar e i18n.jar). Todas las clases java. * Son cargadas por este classloader
.
Extensions Classloader
es el hijo inmediato de Bootstrap classloader. Este cargador de clases carga las clases en el directorio lib / ext del JRE.
System-Classpath classloader
es el elemento secundario inmediato de Extensions classloader. Carga las clases y los CLASSPATH
especificados por la variable de entorno CLASSPATH
Puede intentar inyectar su cargador de clases personalizado mediante la propiedad "java.system.class.loader" (consulte ClassLoader.getSystemClassLoader ).
Default System class loader
es principal para las instancias de MyClassLoader,