三大类加载器AppCLassLoader,ExtLoader,以及双亲委派机制

从上图中可以看到AppClassLoader,ExtCLassLoader并不是真正的父子关系,而是都位于Launcher类里面的静态内部类,他们都分别继承了URLClassLoader

 首先从上图中可以看出Launcher的构造器首先先创建了ExtClassLoader,那具体怎么创建的呢

进入getExtClassLoader方法中,如下利用了一个双重检查创建了一个线程安全的单例的ExtClassLoader

 最后调用了构造方法创建了一个ExtClassLoader,但为什么parent参数为空呢,不应该是bootstrapClassLoader吗?后面会有讲

 

 返回Launcher的构造函数,AppClassLoader也是相似的流程,将ExtClassLoader对象传入,最后调用AppClassLoader创建对象

 怎么加载一个类呢如下图,在AppClassLoader中有一个loandClass方法

 

当进入这个方法会调用CLassLoader的loadClass方法,如下图

 

会生成一个loadClassHelper的对象

 

进入会有一串加载Class的代码如下图的

 

 到这里基本就理清了双亲委派机制的流程是怎么一点点向上委派的

为什么要设计双亲委派机制?
沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心
API库被随意篡改
避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一
次,保证被加载类的唯一性



posted @ 2023-01-17 10:25  京木木  阅读(566)  评论(0)    收藏  举报