¿Por qué usar un cargador de clase?
En el idioma Java, la carga de clase se completa durante la operación del programa. Aunque esta estrategia aumentará ligeramente la sobrecarga de rendimiento cuando la carga de clase, proporcionará a las aplicaciones Java un alto grado de flexibilidad. Por ejemplo:
1. Escriba una aplicación orientada a la interfaz y puede esperar hasta que se ejecute antes de especificar su subclase de implementación;
2. Los usuarios pueden personalizar un cargador de clase, permitiendo que el programa cargue una secuencia binaria desde la red u otros lugares como parte del código del programa en tiempo de ejecución; (Esta es la base para el complemento Android, la instalación dinámica y la actualización del APK)
¿Por qué estudiar todo el proceso de carga de clase?
Mecanismo de carga de clase
El JVM carga el archivo de clase en la memoria y verifica, analiza y inicializa los datos, y finalmente forma todo el proceso de tipo Java que el JVM puede usar directamente.
carga
Cargue el contenido de código de bytecodo del archivo de clase en la memoria y convierta los datos estáticos en una estructura de datos de tiempo de ejecución en el área de método, y genere un objeto java.lang.Class que represente esta clase en el montón, como el portal de acceso para los datos de clase de área de método. Este proceso requiere la participación del cargador de clase.
Enlace
El proceso de combinar el código binario de la clase Java en el estado en ejecución del JVM
inicialización
<clinit>() . El método del constructor de clase <clinit>() es generado por el compilador que recopila automáticamente las acciones de asignación de todas las variables de clase en la clase y la fusión de declaraciones en el bloque de instrucciones estáticas (bloque estático).<clinit>() de una clase esté correctamente bloqueado y sincronizado en un entorno múltiple.Ejemplo 1:
clase pública demo01 {public static void main (string [] args) {a a = new a (); System.out.println (a.width); }} Clase A {public static int width = 100; // Variable estática, campo estático Campo estático {System.out.println ("Clase de inicialización estática A"); ancho = 300; } public a () {System.out.println ("Crear un objeto de la Clase A"); }}analizar:
ilustrar:
Hay pilas, montones (lugares creados por los lugares) y áreas de método en la memoria (en realidad un montón especial)
1. Cuando el JVM carga demo01, primero forme los datos estáticos (variables de clase, métodos de clase, código ...) en el área del método. Al mismo tiempo, se formará un objeto java.lang.Class (objeto reflexivo) en el montón, que representa la clase Demo01. A través del objeto, se puede acceder a la estructura binaria de clase. Luego cargue la información de la Clase A variable y también forme un objeto A en el montón, representando la clase A.
2. Cuando se ejecuta el método principal, la trama de la pila del método principal se formará en la pila, y un método corresponde a un marco de pila. Si el método principal llama a otros métodos, lo presionará uno por uno en la pila. Hay una variable local A Tipo A en el método principal. Al principio, el valor de A es nulo. El constructor de la clase A se llama a través de nuevo. El método a () se genera en la pila y el objeto A se genera en el montón. Luego, la dirección de un objeto se paga a A en la pila. En este momento, A tiene una dirección de objeto.
3. Cuando se llama a A.Width, se llama a los datos del área del método.
Cuando una clase se carga por referencia, la clase solo se cargará una vez
Referencia activa de la clase (definitivamente ocurrirá la inicialización de la clase)
java.lang.reflect para hacer llamadas de reflexión a la clase Referencia pasiva a la clase (la inicialización de la clase no ocurrirá)
Ejemplo 2:
clase pública demo01 {static {System.out.println ("Demo01 de inicialización estática); } public static void main (string [] args) lanza la excepción {System.out.println ("¡Método principal de Demo01!"); System.out.println (System.getProperty ("java.class.path")); // Referencia activa // new a (); // system.out.println (a.width); // class.forname ("com.sinosoft.test.a"); // referencia pasiva // system.out.println (a.max); // a [] as = nuevo a [10]; System.out.println (B.Width); // La clase B no se cargará}} La clase B extiende una {static {System.out.println ("Inicialización estática B"); }} La clase A se extiende a_father {public static int width = 100; // Variable estática, campo de dominio estático público estático final int max = 100; static {System.out.println ("Clase de inicialización estática A"); ancho = 300; } public a () {System.out.println ("Crear un objeto de la Clase A"); }} clase A_Father extiende el objeto {static {System.out.println ("Inicialización estática a_father"); }}Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.