类加载过程为JVM将类描述数据从.class文件中加载到内存,并对数据进行解析和初始化,最终造成被JVM直接使用的Java类型。包含:java
类加载过程当中的加载操做由类加载去完成。类加载器分为:数据结构
双亲委派过程:当一个类加载器收到类加载任务时,当即将任务委派给它的父类加载器去执行,直至委派给最顶层的启动类加载器为止。若是父类加载器没法加载委派给它的类时,将类加载任务退回给它的下一级加载器去执行。this
双亲委派模型最大的好处就是让Java类同其类加载器一块儿具有了一种带优先级的层次关系。举个例子来讲明下:好比咱们要加载顶层的Java类——java.lang.Object类,不管咱们用哪一个类加载器去加载Object类,这个加载请求最终都会委托给启动类加载器(Bootstrap ClassLoader),这样就保证了全部加载器加载的Object类都是同一个类。若是没有双亲委派模型,就会出现 Wupx::Object 和 Huyx::Object 这样两个不一样的Object类。spa
java.lang.ClassLoader 的 loadClass() 方法code
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
Class<?> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
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;
}
}复制代码
本文由博客一文多发平台 OpenWrite 发布!cdn