En carga las clases de Java

Larga la intención de escribir un blog sobre la carga de clases, porque he estado preocupado por este proceso durante un largo tiempo, finalmente tendrá tiempo para escribir algunas ideas de hoy

Hay muchos artículos en línea acerca de la carga de clases, muchos no son rigurosas, error, si lo desea corregir, más un estudio en profundidad, es necesario ir a la página oficial para ver el oráculo de Java Virtual Machine especificación.

Ruta un poco profunda, junto con la imagen de abajo para encontrar la esquina superior izquierda
Aquí Insertar imagen Descripción

---------- ---------- en el tema

Aquí preparamos una herramienta de código de bytes jclasslib espectador (GitHub interior), que se utiliza para analizar los archivos de código de bytes

Después de que el archivo Java se compila en el archivo de código de bytes (.class), es necesario entrar en la máquina virtual mediante la carga de esta parte importante

Los componentes básicos:

De carga - Enlaces - inicialización

De carga (Load)

Especificación en esta frase: Hay dos tipos de cargadores de clases :. El cargador de clases de arranque suministrado por la máquina virtual de Java, y cargadores de clases definidas por el usuario se han descrito dos tipos de cargador (cargador de clases de arranque y la clase definida por el usuario), Como su nombre indica, la diferencia es si heredado clase abstracta cargador de clases, estos cargadores tienen una relación superior-subordinado, el mecanismo de los padres seguimiento de carga delegado, que se carga recibe una solicitud de carga siempre se pone en marcha por primera vez en un cargador de carga, si el padre no se puede cargar y después se carga por sí mismos

La API de núcleo está cargado por el cargador de clases de arranque, por ejemplo, para cargar la clase java.lang.String, cargador de clases bootstrap recibe la solicitud, pero tienen un nivel más alto cargador, por lo que la clase String se carga inmediatamente

Este paso va a generar un objeto de clase de carga (mecanismo de reflexión Java) se detallan especificación

Y prestar atención a cargar una clase se carga antes de su matriz, aquí código demuestra

public class LodingTest {
 
 static class Father{
  static {
   System.out.println("加载父类中....");
  }
 }
 
 static class Son extends Father{
  static {
   System.out.println("加载子类中...");
  }
 }
 public static void main(String[] args) {
  new Son();
 }
}

Aquí Insertar imagen Descripción

Enlace (Link)

La vinculación de una clase o interfaz implica la verificación y la preparación de esa clase o interfaz, su superclase directa, sus súper interfaces directas, y su tipo de elemento (si se trata de un tipo de matriz), si es necesario. La vinculación también implica la resolución de
referencias simbólicas en la clase o interfaz, aunque no necesariamente
al mismo tiempo que la clase o interfaz se verifica y preparado.

Resumido en tres partes: la verificación de especificación resolución preparación se explican en detalle

Que los archivos de código de bytes que verifican la verificación de las consideraciones de seguridad de máquinas virtuales

preparar procedimiento como una clase o interfaz para crear propiedades estáticas, es decir, variables de clase (variables de clase sin una modificación final, debido a que la modificación static final es una constante, la etapa de compilador ha sido procesada) y el bloque de código estático, e inicializa el valor predeterminado, pero destacar que este proceso de no es necesario esperar hasta cualquier ejecución de la instrucción, la inicialización por defecto no está explícitamente inicializado inicializado explícitamente para llevar a cabo la etapa de inicialización

es decir, de referencia resolución simbólica analítica (referencia simbólica), con una serie de instrucciones de máquina virtuales como anewarray, checkcast, getField, getstatic ... relacionada con la aplicación, la resolución es un proceso muy complejo, con la especificación describe una longitud larga ...

inicialización

Inicialización etapa de la implementación de un clinit clase o inicialización de interfaz de método, este método no requiere que nos escritura, y el nombre clinit en el programa Java no es un identificador válido, no hay manera de escribir, este método de recogida de la acción estática asignada automáticamente por una máquina virtual y un bloque estático se completa

Aquí utilizamos las herramientas que hemos mencionado anteriormente demuestran
el código

public class LodingTest {
 
 static int a = 1;
 static {
  double b = 0.5;
 }
 public static void main(String[] args) {
  new LodingTest();
 }
}

Después de generar el archivo de código de bytes mediante herramientas analíticas
Aquí Insertar imagen Descripción
podemos ver el método clinit código de bytes de la generación automática de una
inicialización de la clase es condicional, por ejemplo, cuando C se inicializa
para llevar a cabo todas las referencias pertinentes C y una virtuales instrucciones de la máquina
inicializar una subclase de C
si C es la interfaz y declara un método no abstracto, no estático, inicializar una clase C, directa o indirectamente
...

-------------------------------------------------- --------------

Escribió por primera vez aquí, hay una necesidad de añadir ...

Liberadas dos artículos originales · ganado elogios 4 · Vistas 113

Supongo que te gusta

Origin blog.csdn.net/weixin_44883515/article/details/104953670
Recomendado
Clasificación