Hablar de todos los aspectos relacionados con la carga de clases de Java.

Que es un cargador de clases

El cargador de clases es un módulo que carga la descripción de la clase en la memoria de la máquina virtual; la descripción típica de la clase es el archivo de clase compilado a partir del código fuente de Java, y también puede estar en cualquier otro formato de datos, como como flujos de bytes de red;

Que son los cargadores de clases

Java define tres tipos de cargadores de forma predeterminada:

1. Bootstrap Class-Loader (Bootstrap Class-Loade) carga principalmente el paquete jar bajo jre / lib.
2. Extension o Ext Class-Loader (Extension o Ext Class-Loader) carga principalmente el paquete jar bajo jre / lib / ext / directorio; El directorio jre / lib / ext / se puede anular especificando java.ext.dirs)
3. Aplicación o Cargador de clases de aplicación, que carga el contenido de la ruta de clases (classPath es un conjunto de combinaciones de directorios).
El cargador de clases de aplicación se puede "anular". El cargador de clases de aplicación original se puede anular mediante el parámetro completo de -Djava.system.class.loader = com.yourcorp.YourClassLoader; las comillas dobles se agregan en la sobrescritura, que en realidad es El cargador de clases definido se denominará el padre del cargador de clases de aplicación predeterminado;

Esto generalmente se hace cuando es necesario cambiar el modelo de delegación principal; para el modelo de delegación principal, consulte a continuación;

Modelo de delegación principal del cargador de clases

¿Qué es el modelo de delegación principal?

Cuando Class-Loader intenta cargar un cierto tipo, a menos que el cargador padre no pueda encontrar el tipo correspondiente, intente delegar esta tarea al cargador padre del cargador actual. El propósito de usar el modelo de delegación es evitar la carga repetida de tipos de Java

Por qué adoptar el modelo de delegación principal

La adopción del modelo de delegación parental se basa principalmente en dos consideraciones:

Para garantizar la unicidad de la clase, una clase solo se carga una vez para evitar la carga repetida; (porque en la especificación JVM, el mismo archivo de clase es cargado por dos clases iguales, se considerará como dos clases)
seguridad, para garantizar la el núcleo de la API de Java no se reemplaza, es decir, las clases cargadas por el cargador de clases de inicio no serán sobrescritas por otro cargador de clases;

Qué rompe el modelo de delegación parental y por qué

Servicio JNDI
Servidor Tomcat
Implementación OSGI Actualización en caliente
La razón por la cual el escenario anterior rompe el modelo de delegación parental es que la clase padre no puede cargar o completar alguna lógica requerida. Para hacer que el diseño de la arquitectura general sea más elegante y flexible, se entrega a el cargador de subclase para cargar;

El proceso de carga de clases

La carga de clases se divide principalmente en tres procesos: carga, vinculación e inicialización;

Cargando : Java lee datos de código de bytes de diferentes fuentes de datos en la JVM y los asigna a una estructura de datos (objeto de clase) reconocida por la JVM

Enlace : Este es el paso principal. En pocas palabras, la información de definición de clase original se transforma sin problemas en el proceso de ejecución de JVM. Específicamente, se divide en tres procesos: verificación, preparación y análisis;

Verificación: Verificar que el objeto Class se ajusta a las especificaciones de la máquina virtual.
Preparación: Crear variables estáticas y preparar espacio de memoria.
Análisis: Modificar las referencias de símbolo en el grupo constante a referencias directas.
Inicialización : Ejecutar la lógica de inicialización de la clase, incluyendo estática asignación de campo, inicialización de bloque estático, etc. La inicialización del tipo padre tiene prioridad sobre el tipo actual.

¿Cuáles son los escenarios de aplicación del cargador de clases personalizado?

Modificar la lógica del código de bytes de la clase, como: tejiendo uniformemente la lógica general para clases externas;
creando clases dinámicamente de acuerdo con las necesidades del usuario; por ejemplo: clases de controlador JDBC, diferentes bases de datos necesitan usar diferentes
nombres de paquetes de clases de controladores + conflictos de nombres de clases Cuando un el cargador de clases no se puede cargar al mismo tiempo, se puede cargar en la memoria con un cargador de clases diferente; la
función de actualización en caliente, a través de un cargador de clases personalizado, realiza la carga y descarga dinámica de clases durante la operación

Implementación del cargador de clases personalizado

El núcleo principal se encuentra en la fase de obtención del código de bytes de la clase Para mapear el código de bytes al objeto de Clase, esta parte generalmente no está involucrada;

public class CustomClassLoader extends ClassLoader {
    
    
 
    @Override
    public Class findClass(String name) throws ClassNotFoundException {
    
    
        byte[] b = loadClassFromFile(name); //这里是核心逻辑
        return defineClass(name, b, 0, b.length);
    }
 
    private byte[] loadClassFromFile(String fileName)  {
    
    
        InputStream inputStream = getClass().getClassLoader().getResourceAsStream(
                fileName.replace('.', File.separatorChar) + ".class");
        byte[] buffer;
        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        int nextValue = 0;
        try {
    
    
            while ( (nextValue = inputStream.read()) != -1 ) {
    
    
                byteStream.write(nextValue);
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        buffer = byteStream.toByteArray();
        return buffer;
    }
}

resumen

Hoy compartí con ustedes el siguiente conocimiento del cargador de clases java:

1. ¿Qué es un cargador de clases
? 2. ¿Cuáles son los cargadores de clases específicos?
3. El modelo de delegación principal
durante la carga de clases. 4. El proceso específico de
carga de clases. 5. Los escenarios de aplicación del cargador de clases personalizado.
6. La realización de cargador de clases.

Aprenda programación de Java con una base cero, puede unirse a mi campo de aprendizaje de Java de diez años . Intercambios técnicos, intercambio de recursos, respuesta a preguntas y resumen de la experiencia de desarrollo.

Supongo que te gusta

Origin blog.csdn.net/weixin_49794051/article/details/112982918
Recomendado
Clasificación