下图展现的就是双亲委派模型
三种类加载器在:JVM --类加载器_crazyK.的博客-CSDN博客 中已经提到过。
双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器。
双亲委派模型的工作流程是:如果一个类加载器收到了类加载的请求,它首先不会自己尝试去加载这个类,而是把这个类委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去完成加载
用大白话说就是:
1.类加载器收到类加载的请 2.将这个请求向上委托给父类加载器去完成,一 直向上委托,知道启动类加载器 3.启动加载器检查是否能够加载当前这个类, 能加载就结束,使用当前的加载器,否则,抛出异常,通知子加载器进行加载 4.重复步骤3
举个例子
创建一个java.lang目录,创建一个String类
public class String {
public String toString() {
return "Hello World!";
}
public static void main(String[] args) {
String string = new String();
System.out.println(string.toString());
}
}
运行一手
因为在运行时,运行的并不是这个String类,根据双亲委派机制,String类会向上加载到扩展类加载器和启动类加载器,加载的是rt.jar下的java.lang.String
而这个String类中没有main方法
一句话就是向上委托,向下加载