1)为什么要设计双亲委派机制?
    1.沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心 API库被随意篡改
    2.避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一 次,保证被加载类的唯一性
    如下图代码:
    package java.lang;
    public class String {
    public static void main(String[] args) {
    System.out.println(“**My String Class**“);
    }
    }
    运行结果:原因是因为在引导类加载器中返回了一个JDK中的String类给应用程序类,应用程序类在运行main方法时找不到JDK中的String类。
    image.png

    2).双亲委派机制如图:
    image.png

    3). 这里类加载其实就有一个双亲委派机制,加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的 类加载路径中查找并载入目标类。 比如我们的文章1.1中的Math类,最先会找应用程序类加载器加载,应用程序类加载器会先委托扩展类加载 器加载,扩展类加载器再委托引导类加载器,顶层引导类加载器在自己的类加载路径里没找到Math类,则向下退回加载Math类的请求,扩展类加载器收到回复就自己加载,在自己的类加载路径里也没找到Math类,又向下退回Math类的加载请求给应用程序类加载器, 应用程序类加载器于是在自己的类加载路径里找Math类,结果找到了就自己加载了。 双亲委派机制说简单点就是,先找父加载,不行再由儿子自己加载

    4). 应用程序类加载器AppClassLoader加载类的双亲委派机制源码,AppClassLoader 的loadClass方法最终会调用其父类ClassLoader的loadClass方法,该方法的大体逻辑如下:
    1. 首先,检查一下指定名称的类是否已经加载过,如果加载过了,就不需要再加载,直接返回。
    2. 如果此类没有加载过,那么,再判断一下是否有父加载器;如果有父加载器,则由父加载器加载(即调用parent.loadClass(name, false);).或者是调用bootstrap类加载器来加 载。
    3. 如果父加载器及bootstrap类加载器都没有找到指定的类,那么调用当前类加载器的 findClass方法来完成类加载。

    5).双亲委派由下向上加载而不是由上向下加载的原因猜测:
    对于一个app应用程序来说,大部分的类加载都是加载自己写的那些代码,由下向上在第一次加载可能会多走两次加载流程,但对于加载过之后来说就是直接可以返回了,而不再需要每次都由上向下多走两次加载。

    6).双亲委派实现的在ClassLoader的loadClass中:
    image.png

    7). 全盘负责委托机制 “全盘负责”是指当一个ClassLoder装载一个类时,除非显示的使用另外一个ClassLoder,该类所依赖及引用的类也由这个ClassLoder载入。