tutorial example java classloader

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,