Comprenda ClassLoader en cinco minutos

java.lang.ClassLoaderResumen de la clase:

imagen

A partir de la introducción de la clase ClassLoader en el documento, se puede concluir que la función de esta clase es encontrar el archivo de código de bytes de clase correspondiente de acuerdo con el nombre completo de una clase especificada y luego cargarlo en una instancia de java. .lang.Class clase.

La división de cargadores de clases :

Bootstrap ClassLoader:

 Este cargador de clases es responsable de cargar la biblioteca de clases en el directorio <JAVA_HOME> \ lib en la memoria de la máquina virtual para cargar la biblioteca central de java. Este tipo de cargador no hereda de java.lang.ClassLoader y no puede ser usado directamente por el programa Java. Llame, el código está escrito en C ++. Es una parte de la propia máquina virtual.

Extension ClassLoader (Extendsion ClassLoader):
 este cargador de clases es responsable de cargar la biblioteca de clases en el directorio <JAVA_HOME> \ lib \ ext para cargar la biblioteca de extensiones de java. Los desarrolladores pueden usar este cargador de clases directamente.

Cargador de clases de aplicación:

Este cargador de clases es responsable de cargar la biblioteca de clases bajo la ruta de clases del usuario (CLASSPATH). Generalmente, las clases java que escribimos son cargadas por este cargador de clases. Este cargador de clases es el valor de retorno del método getSystemClassLoader () en CLassLoader, por lo que También se denomina cargador de clases del sistema En general, es el cargador de clases predeterminado del sistema.

Además, también podemos agregar nuestro propio cargador de clases para satisfacer necesidades especiales y la necesidad de heredar la clase java.lang.ClassLoader.

  La relación jerárquica entre los cargadores de clases es la siguiente:


Observe el cargador de clases con código:

paquete com.wang.test; 

Public class TestClassLoader { 

    public static void main (String [] args) { 
        ClassLoader loader = TestClassLoader.class.getClassLoader (); 
        System.out.println (loader.toString ()); 
        System.out.println (loader.getParent (). ToString ()); 
        System.out.println (loader.getParent (). GetParent ()); 
    } 
}

Observe el resultado de la impresión:

sun.misc.Launcher$AppClassLoader@500c05c2
sun.misc.Launcher$ExtClassLoader@454e2c9c
null

La primera línea imprime el cargador de clases de la aplicación (cargador predeterminado), y la segunda línea imprime su cargador de clases padre y el cargador de clases extendido. Según nuestra idea, la tercera línea debería imprimir el cargador de clases de inicio, aquí Sin embargo, el nulo devuelto es debido to getParent (). Si devuelve un valor nulo, el cargador de clases de inicio se utiliza como cargador principal de forma predeterminada.

 El modelo de delegación padre del cargador de clases:

El modelo de delegación principal es una especificación para organizar la relación entre cargadores de clases. Su principio de funcionamiento es: si un cargador de clases recibe una solicitud de carga de clases, no intentará cargar esta clase por sí mismo, sino que lo hará. La solicitud se delega al cargador de clases principal para completar, por lo que capa por capa, y finalmente todas las solicitudes de carga se pasan al cargador de clases de inicio superior, solo cuando el cargador de clases principal no puede completar la solicitud de carga (su rango de búsqueda si no se encuentra la clase requerida), se entregará al cargador de subclase para que intente cargar.

La ventaja de esto es que la clase java tiene una relación jerárquica de prioridad junto con su cargador de clases. Esto es muy necesario, como java.langObject, que se almacena en \ jre \ lib \ rt.jar, es la clase padre de todas las clases de Java, por lo que no importa qué clase se cargue, esta clase debe cargarse. Al final, todas las solicitudes de carga se resumen en el cargador de clases de inicio de nivel superior. Por lo tanto, el cargador de clases de inicio cargará la clase Object , por lo que los cargados son todos de la misma clase.Si el modelo de delegación padre no se usa y cada cargador de clases lo carga por sí mismo, habrá más de una clase de Objeto en el sistema y la aplicación se estropeará por completo.

Class.forname () 与 ClassLoader.loadClass ():

Class.forname (): es un método estático, el más comúnmente utilizado es Class.forname (String className); devuelve un objeto Class de acuerdo con el nombre completo de la clase pasada. Este método carga el archivo Class en la memoria en al mismo tiempo, realizará la inicialización de la clase.

如: Class.forName (“com.wang.HelloWorld”);

ClassLoader.loadClass (): este es un método de instancia que requiere un objeto ClassLoader para llamar a este método. Cuando este método carga el archivo de clase en la memoria, la inicialización de la clase no se realizará y la inicialización no se realizará hasta que La clase se usa por primera vez. Debido a que este método necesita obtener un objeto ClassLoader, puede especificar qué cargador de clases usar según sea necesario.

如: ClassLoader cl = …….; Cl.loadClass (“com.wang.HelloWorld”);


Supongo que te gusta

Origin blog.51cto.com/15082402/2644359
Recomendado
Clasificación