Un cargador de clases
La fase de carga de clases para obtener la descripción de tales datos binarios en nombre de clase completo por una clase de esta corriente en la acción exterior JVM implementadas para lograr esta acción módulos de código llamados "cargador de clases."
Para cualquier clase, tendrá que establecer la singularidad de su JVM cargado por el cargador de clases y la clase en sí juntos. En otras palabras, si se carga un tipo diferente de cargador de clases, entonces las dos clases en la JVM es diferente.
Tres tipos cargador
JVM construido tres ClassLoader importante, además de otros BootstrapClassLoader por el cargador de clases de Java e implementar todas heredado de java.lang.ClassLoader
:
- BootstrapClassLoader (boot loader clase) : a nivel de primera clase de carga, realizado por C ++, se encarga de cargar
%JAVA_HOME%/lib
el paquete frasco y la clase o directorio, o-Xbootclasspath
todos los parámetros especificados en la ruta de clase. - ExtensionClassLoader (extensión cargador de clases) : principalmente responsable de cargar el directorio de
%JRE_HOME%/lib/ext
paquete frasco y directorio de la clase ojava.ext.dirs
paquete frasco bajo variables del sistema ruta especificada. - AppClassLoader (cargador de clases de la aplicación) : para nuestros usuarios cargador es responsable de cargar todos los paquetes y clases tarro actuales en el classpath de la aplicación.
Desde la perspectiva de los dos únicos cargador de clases JVM:
(1) ClassLoader boostrap: Es toda la parte derecha de JVM implementación en C ++.
(2) el otro es el otro tipo de cargadores de clases, implementado por el java, toda clase abstracta java.lang.ClassLoader integrado.
En segundo lugar, el modelo de delegación de los padres
Cada clase tiene un cargador de clases que. Sistema ClassLoder en el trabajo cuando se utiliza el valor por defecto modelo de delegación de los padres . Que es cuando se carga la clase, el sistema determinará primero si la clase es cargada también. Se ha cargado la clase será devuelto directamente, o tratará de carga. Cuando se carga, la solicitud se delega en el primer cargador de clases padre loadClass()
proceso, por lo que en última instancia, todas las solicitudes deben ser transferidos a la parte superior del cargador de clases de arranque BootstrapClassLoader
en. Cuando el cargador de clases padre no puede manejar, sólo para ser manejado por ellos mismos. Cuando el cargador de clases padre es nulo, se utiliza un cargador de clases de arranque BootstrapClassLoader
como cargador de clases padre.
Nota: La relación padre-hijo entre el cargador de clases no es de manera hereda, pero en combinación (prioridad)
fuente
private final ClassLoader parent;
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// 首先,检查请求的类是否已经被加载过
Class<?> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
if (parent != null) {//父加载器不为空,调用父加载器loadClass()方法处理
c = parent.loadClass(name, false);
} else {//父加载器为空,使用启动类加载器 BootstrapClassLoader 加载
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
//抛出异常说明父类加载器无法完成加载请求
}
if (c == null) {
long t1 = System.nanoTime();
//自己尝试加载
c = findClass(name);
// this is the defining class loader; record the stats
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
Si no desea utilizar el modelo de delegación de los padres: la necesidad de que el cargador de clases personalizada, reescribir loadClass método (), necesidad de ser clase ClassLoader integrado.