java mecanismo de carga de clases, cargador de clases, cargador de clase personalizada

mecanismo de carga Clase

clase Java de ser cargado en la JVM para descargar la JVM, la totalidad comprende ciclo de vida: de carga (carga), la verificación (verificación), preparación (Preparación), el análisis (Resolución), inicializar (inicialización), el uso de (usando), y descarga ( descarga) siete etapas. En el que la verificación, la preparación y analíticos tres porciones conectados colectivamente (Vinculación).

 

1, Load

Cargando refiere a los datos binarios leídos archivos de clase .class en la memoria, el método en el que la región del área de datos de tiempo de ejecución, y después crear un java.lang.Class objeto montón, utiliza para empaquetar la clase en el método de la zona de estructura de datos.

 

Clase cargado por el cargador de clases JVM proporciona completa, el cargador de clases es la carrera base. Todos los archivos de clase cuando el programa comenzó, y no utilizar el cargador de una sola vez, pero si es necesario, por el mecanismo de la clase java cargador (cargador de clases) para cargar dinámicamente un archivo de clase en la memoria.

JVM en tiempo de ejecución producirá tres cargador de clases:

Inicio cargador de clases (ClassLoader Bootstrap) : java jerarquía del cargador de clases es el más alto-cargador de clases es responsable de cargar el núcleo bibliotecas JDK. Implementado por C ++, no una subclase de cargador de clases.

cargador de clases de extensión (cargador de clases de la extensión) : responsable de cargar las bibliotecas de extensión de Java, tales lib / ext propiedad del sistema java.ext.dirs o el directorio especificado por un frasco. cargador de clases padre a nulo.

cargador del sistema de clases (la App cargador de clases) : responsable de cargar las opciones -classpath del mandato java, atributo del sistema java.class.path se especifica la ruta de clase y un frasco. Programa () puede ser adquirida por el método estático loader cargador de clases de clases del sistema de getSystemClassLoader. Implementado por el lenguaje Java, el cargador de clases padre es ExtClassLoader.

Además de estos tres java cargador de clases proporciona de forma predeterminada, los usuarios pueden definir su propio cargador de clases sea necesario, estas cargador de clase personalizada debe heredar de la clase java.lang.ClassLoader.

Mediante el uso de un cargador de clases diferentes, los datos binarios de las diferentes fuentes pueden ser las clases cargadas. Por lo general, las siguientes situaciones:

Cargar archivos de clase en el sistema de archivos local, que es la forma más de la instancia de cargador de clases del programa. Tarro paquete cargado de clase de la clase, este enfoque también es común. Cargan a través de una red a un archivo de clase Java clase dinámicamente compilado fuente, y llevar a cabo una carga, tal como JSP.

2, la conexión

Cuando después se carga la clase, el sistema genera una clase correspondiente a quien el objeto, y luego en la etapa de conexión (validación - Preparación - Analytical) conectado a la fase de fusión es responsable de los datos binarios a la clase en jre.

Verificar: medios para detectar si la clase cargado tiene las estructuras internas correctas, y otros tipos y coordinada. Cuatro de autenticación que comprende: formato de archivo de verificación, validación de metadatos, el byte de comprobación y verificación de referencias simbólicas. Preparación: responsable de la asignación de memoria para las variables de clase, y establecer el valor inicial por defecto. Análisis: La variable de datos binarios en la clase sustituye por una referencia símbolo de referencia directa.

3, la inicialización

En la fase de inicialización, la variable estática clase dada principalmente el valor inicial correcta. De hecho, el constructor de la clase de implementación <clinit> () método. clase Java especificada en el valor inicial de la variable de clase de dos maneras: una declaración de clase especifica el valor inicial cuando la variable; bloque B usando la inicialización estática para la clase especificada valor inicial variable.

JVM inicializar una clase comprende las etapas de:

La carga y la inicialización de su conexión directa a los estados de inicialización de clase padre clase ejecutados secuencialmente cuando la etapa 2, la inicialización del sistema sigue la matriz directa de 1 a 3, y así sucesivamente.

Cuando una clase se desencadenantes de inicialización citado proceso de forma activa:

Encuentro nueva,, invokestatic putstatic getstatic ó 4 cuando esta instrucción de código de bytes, si la clase no se ha inicializado, se requiere inicialización a desencadenarla. 4, que genera la instrucción de código Java el escenario más común es: cuando se utiliza la nueva palabra clave para objetos instanciar, para leer o establecer un campo estático de una clase (la modificación final, el resultado ha sido colocado en la piscina constante, excepto para el campo compilador estático tiempo), así como llamar a un método estático de la clase. Cuando se utiliza el enfoque java.lang.reflect paquete para reflejar la clase llamada, si la clase no se ha inicializado, es necesario activar su inicialización. Al inicializar una clase, si encuentra la clase padre no se ha inicializado, es necesario inicialización gatillo de la clase padre. Cuando la máquina virtual se inicia, el usuario tiene que especificar una ejecución de la clase principal (incluido el método main () de clase), la máquina virtual para inicializar esta clase. Cuando se utiliza un JDK7 apoyo lenguaje dinámico +, ejemplo java.lang.invoke.MethodHandle si el resultado final análisis REF_getStatic, REF_putStatic, REF_invokeStatic el mango método, y esta clase de mango método no correspondiente ha inicializado, se requiere la inicialización de gatillo . Cuando una clase si es pasiva citado, no se procesa la inicialización de disparo:

Hacen referencia a un campo estático de la clase padre por sub-categoría, subcategoría no causa la inicialización. Para los campos estáticos, sólo definen directamente el campo de la clase será inicializado, por lo que cuando nos referimos a un campo estático de la clase primaria definida por la subclase único desencadenante inicializar la clase padre, sin que se dispare inicializar la subclase. Para referirse a la clase por la definición de la matriz, que no desencadena este tipo de inicialización. Constantes en tiempo de compilación se acreditarán en la clase del grupo de constantes que se llama, no hay ninguna referencia directa a la definición de las constantes de clase de la naturaleza, no se disparará clase de inicialización constante definida.

4, usando

(Ligeramente)

5. Desinstalar

Si ocurre lo siguiente, las clases se desinstalará:

Todas las instancias de la clase han sido recuperados, que es montón de Java cualquier instancia de la clase no existe. Cargador de clases de la clase de carga ha sido recuperado. Java.lang.Class correspondiente a la clase de objeto no se hace referencia a ninguna parte, que no se refleja por el método de acceso a cualquier clase. Si se cumplen las tres condiciones anteriores, se descargará la clase JVM al distrito de los métodos de recolección de basura, el proceso de desinstalación es en realidad un poco de área despejada en la información de clase método, clases de Java en todo el ciclo de vida se ha acabado.

 

 

cargador de clases

Clase cargador es responsable de cargar todas las clases. Que genera un objeto de instancia java.lang.Class se carga en memoria para todas las clases. Una vez una clase se carga como la JVM, la misma clase no se cargará de nuevo. También igual que un objeto tiene un identificador único, como una clase JVM carga tiene un identificador único. En Java, una clase por su nombre de clase completo (incluyendo el nombre del paquete y el nombre de clase) como un identificador, sin embargo, en la JVM, una clase con su nombre de clase completo y su cargador de clases como su identificación única. Por ejemplo, si hay una clase llamada Persona en paquete pg, por el cargador de clases es responsable de ejemplos de carga ClassLoader KL, correspondiente al objeto persona Class clase se muestra en la JVM (Person.pg.kl). Esto significa que dos de los mismos nombre de clase de cargas para carga la clase: (Person.pg.kl) y (Person.pg.kl2) son diferentes, son clase cargada es completamente diferente, incompatible.

Ya hemos introducido varias cargador de clases Java en, vamos a utilizar un diagrama para mostrar su nivel:

 

etapa de carga de Clase

Clase cargas cargador de clases 8 generalmente requiere los siguientes pasos:

Detectar si la carga sobre esta clase, es decir, si existe en este tampón de clase, si hay vaya directamente al paso 8, de lo contrario ir a paso 2. Si no hay ningún cargador de clases padre, cualquiera de los padres es el cargador de clases raíz, o es en sí mismo el cargador de clases raíz, vaya al paso 4, si el cargador de clases padre está presente, vaya al paso 3. Solicitud utilizando el cargador de clases padre para cargar una clase de destino, en caso de cargar con éxito continúe en el paso 8, de lo contrario continúe con el paso 5. Solicitar el cargador de clases de raíz para cargar una clase de destino, en caso de cargar con éxito continúe en el paso 8, de lo contrario, vaya al paso 7. El cargador de clases actual intenta encontrar el archivo de clase, si se encuentran a continuación, paso 6, si no puede encontrar el paso 7. Clase de carga desde el archivo, después de un salto con éxito al paso 8. ClassNotFountException lanzar una excepción. Java.lang.Class devuelve el objeto correspondiente.

mecanismo de carga Clase

La responsabilidad general: Cuando un cargador de clases es responsable de la carga de una clase, la clase depende y también será referencias a otra clase Este cargador de clases es responsable de la carga, a menos que de la utilización de otro cargador de clases de carga. Delegar los padres: dejar que los intentos cargador de clases padre a cargar la clase, sólo en el cargador de clases padre cuando los intentos de clase para cargar la clase no se puede cargar desde su propia ruta de clase. Habla popular, es un cargador de clases en particular para cargar una clase, a petición, la primera tarea estará a cargo de las cargas del cargador padres, a su vez, la recursividad, si el cargador de clases padre puede cargar completa la tarea retorno satisfactorio; sólo el Padre cuando el cargador no puede completar esta tarea de carga, cargar ellos mismos. Caché Mecanismo: para asegurar que se almacenan en caché todas las cargas sobre la clase, cuando el programa requiere el uso de una clase, cargador de clases en primer lugar de la zona de amortiguación en busca de la clase, la clase de objeto sólo cuando no hay ninguna zona de amortiguación, el sistema la lectura correspondiente a dichos datos binarios, y la convierte en objeto Class, almacenados en la memoria intermedia. Esto es después de que se modifique la clase, debe reiniciar las razones JVM, las ediciones en los programas no forzará.

cargador de clase personalizada

Todo cargador de clases JVM excepto con el cargador de clases son instancias de las subclases de cargador de clases, los desarrolladores pueden implementar un cargador de clase personalizada subclase cargador de clases mediante la expansión y el método ClassLoader contiene reescrito. Cargador de clases después de dos formas principales:

loadClass (String name, determinación boolean): Este método es ClassLoader punto de entrada para cargar la clase con el nombre especificado, el sistema llama el método es a objeto de clase adquieren ClassLoader para la clase especificada. FindClass (String name): Si necesita encontrar la clase para implementar ClassLoader personalizado con el nombre especificado, puede hacerlo mediante la reescritura de los anteriores dos métodos, generalmente se recomienda para reescribir método en lugar del método loadClass () FindClass (). método ClassLoader Paso (): 1) findLoadedClass (): para comprobar si se carga la clase, si se devuelve directamente la carga; 2) llamada loadClass método () en el cargador de clases padre. Si el cargador de clases padre es nulo, con el uso de las cargas cargador de clases; el método 3) llamada FindClass (String) para encontrar la clase. Como puede verse a partir de esto, anular los evita método FindClass () anulan el cargador de clase padre delegado de clase por defecto, dos estrategias tampón mecanismo, si loadClass método de reemplazo (), la lógica de aplicación es más compleja.

Publicados 230 artículos originales · ganado elogios 246 · vistas 310 000 +

Supongo que te gusta

Origin blog.csdn.net/kangbin825/article/details/105335633
Recomendado
Clasificación