Cargador de clases
El cargador de clase Java debe cargar dinámicamente las clases requeridas en el JVM en tiempo de ejecución. El cargador de clase Java se basa en tres mecanismos: delegado, visible y soltero.
Cargue los archivos .class debajo del classpath en la memoria y procesarlos en bytecode. Estas tareas son realizadas por el cargador de clase.
Cargador de clase predeterminado
El sistema predeterminado es de tres cargadores de clase:
El cargador de clase también es una clase Java, pero Bootstrap no lo es. Código de verificación:
public class ClassLoaderTest {public static void main (String [] args) {System.out.println (system.class.getClassLoader ()); }}Salida: NULL
If system.out.println (system.class.getClassLoader (). ToString); se usa, se informa una excepción de puntero nulo:
Excepción en el hilo "principal" java.lang.nullpointerexception en com.iot.classloader.classloadertest.main (classloaderTest.java:10) en Sun.reflect.nativemethodaccessorImpl.invoke0 (método nativo) AT Sun.Reflect.nativemethodacCessorImpl.invoke (nativemethodaccessorImpl.java:62) en Sun.reflect.DelegatingMethodaccessorImpl.invoke (delegatingmethodaccessorM.Java:43) en java.lang.reflect.method.invoke (Method.Java:43) com.intellij.rt.execution.application.appmain.main (appmain.java:144)
Como se puede ver, la clase del sistema está cargada por el cargador de clase Bootstrap.
Delegado de cargador de clase Mecanismo
Diagrama de árboles del cargador de clases
Cargador de clases
El orden general de las clases de carga:
Cómo escribir un cargador de clase personalizado
API:
Cargador de clase
Patrón de diseño de método de plantilla
Clase de padres:
LoadClass (proceso de carga de clase, plantilla)
Lógica de carga de clase FindClass para anulaciones de subclase llamadas por el método LoadClass.
Defineclass Get Get Class File convertido en Bytecode
Subclase: anular el método FindClass
ejemplo:
El código fuente del método LoadClass
Clase protegida <?> LoadClass (nombre de cadena, Boolean Resolve) lanza ClassNotFoundException {SynChronized (GetClassLoadingLock (name)) {// Primero, verifique si la clase ya se ha cargado clase <?> c = findLoadClass (name); if (c == null) {long t0 = system.nanotime (); intente {if (parent! = null) {c = parent.loadclass (nombre, falso); } else {c = findBootstrapClassOnnull (nombre); }} Catch (ClassNotFoundException e) {// classnotFoundException lanzado si la clase no se encuentra // desde el cargador de clase principal no nulo} if (c == null) {// Si aún no se encuentra, luego invoque FindClass en orden // para encontrar la clase. largo T1 = System.nanotime (); c = FindClass (nombre); // Este es el cargador de clase definitorio; Registre las estadísticas sun.misc.perfcounter.getParentDelegationTime (). Addtime (t1 - t0); Sun.misc.perfcounter.getFindClasStime (). AddelapsedTimeFrom (T1); sun.misc.perfcounter.getFindClasses (). increment (); }} if (resolve) {resolveclass (c); } return c; }}Ejemplos en la documentación de la API:
Class NetworkClassLoader extiende ClassLoader {String Host; Int Port; public class FindClass (name de cadena) {byte [] b = LoadClassData (nombre); return defineclass (nombre, b, 0, b.length); } byte privado [] LoadClassData (nombre de cadena) {// Cargue los datos de clase desde la conexión. . . }}