Introducción detallada al proceso básico de carga de clase Java
Proceso básico:
- Cargue el flujo de byte binario que define la clase en función del nombre completamente calificado de la clase.
- Convierta la estructura de almacenamiento estático representada por la secuencia de bytes en la estructura de datos de tiempo de ejecución del área de método
- Genere un objeto java.lang.class que represente esta clase en la memoria y úsela como un método para acceder a varios portales de acceso a datos de esta clase.
La clase de matriz en sí no se crea a través del cargador de clase, pero es creada directamente por la máquina virtual Java, y el tipo de elemento de la clase de matriz está cargado por el cargador de clases.
Tipo de elemento de clase de matriz: el tipo de matriz después de eliminar todas las dimensiones.
Verificación del formato de archivo:
- 0xCafebaby comienza con un número mágico;
- La máquina virtual actual puede manejar el número de versión primaria y secundaria;
- tipo constante;
- Tipo de ejecución del índice;
- Tipo de datos codificado UTF8,
Verificación de metadatos: análisis semántico de la descripción del bytecodo Información:
- Si hay una clase principal;
- Si la clase principal hereda la clase modificada final;
- Si una clase no extraída implementa los métodos que deben implementarse en la clase o interfaz principal;
- Sobrescribir de campos y métodos en la clase, contradicciones de sobrecarga;
Verificación del código de byto: determine la legalidad y la corrección del programa a través del análisis semántico de flujo y flujo de control, y la verificación del análisis del cuerpo del método.
- Verificación de referencia del símbolo: cuando la máquina virtual convierte la referencia del símbolo en referencia directa, en la etapa de análisis, realiza una verificación coincidente en información fuera de la clase misma.
- Si la clase correspondiente se puede encontrar mediante nombres completamente calificados descritos por caracteres en referencias simbólicas;
- Especifica si hay descriptores en la clase que coinciden con el campo de método, así como los métodos y campos descritos por el nombre simple;
- Accesibilidad de clases, campos y métodos en referencias simbólicas.
Preparación: asigne la memoria para las variables de clase en el área de método y establezca el valor inicial de las variables de clase.
- El valor inicial suele ser el valor cero del tipo de datos, y el valor modificado final se inicializa directamente al valor correspondiente.
- Las variables de clase son variables modificadas estáticamente, distinguidas de las variables de instancia.
Análisis: la máquina virtual reemplaza las referencias simbólicas en el grupo constante con un proceso de referencia directa
Constant_class_info, constant_fieldref_info, constant_methodref_info ..
- Referencia de símbolos: un conjunto de símbolos describe el objetivo referenciado. Cualquier forma de literales se puede usar para localizar el objetivo sin ambigüedad. No tiene nada que ver con la implementación de la memoria de la máquina virtual e independientemente de si el objetivo de referencia está cargado.
- Referencia directa: un puntero directamente al destino, un desplazamiento o un mango que está ubicado indirectamente al objetivo, está relacionado con la memoria implementada por la máquina virtual. Se debe cargar el objeto de objetivo relacionado con la referencia directa.
- . . .
Inicialización: Comience a ejecutar el código del programa Java en la definición de clase. Ejecutar el método de constructor de clase <Pnit> (),
<Cinit> ():
- El compilador recopila automáticamente las acciones de asignación de las variables de clase en la clase de acuerdo con el orden de definición en el archivo de clase y fusiona las declaraciones del bloque de instrucción estática. El bloque de instrucción estática solo puede acceder a las variables definidas antes.
- A diferencia del constructor de clase, no se requiere que el constructor de clase principal se llame como se muestra. La máquina virtual asegura que la clase principal <NIT> () se haya ejecutado antes de que se ejecute la subclase.
- El bloque de instrucción estática en la clase principal se ejecuta primero.
- <nitit> () no es necesario para clases o interfaces, y no se generará si no hay operación de asignación variable o bloque de instrucción estática.
- La <cinit> () de la interfaz no necesita ejecutar primero la interfaz principal de la interfaz principal, y no es necesario la misma clase de implementación de interfaz <Cinit> ().
- Seguridad del hilo: la máquina virtual asegura que <nitit> () esté correctamente bloqueado y sincronizado en un entorno múltiple. Solo un hilo puede acceder al <cinit> () de la clase de inicialización al mismo tiempo.
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!