上一篇博客中我们说了java中有多个类加载器,分别加载各自负责的类。但是这样出现一个问题,如果各自负责的类加载器中有重复的类?这时候怎么办? 让它被不同的类加载器加载多次?? 显然是不合理的
双亲委派机制的核心就是解决一个类到底由谁加载,且不会被重复加载。
双亲委派机制设计的很巧妙,首先要明确最核心的一点:类加载器之间不是平等的,但是逻辑上的父子关系(不是继承) 如图:
当一个类被加载的时候 JVM先会判断:
- 这个类是不是已经被加载过了?加载过了就直接返回加载的class对象,不需要再加载第二次
- 如果没有被加载过?那么哪个类加载器来搞定它?
这个就是双亲委派机制的核心:
- 先向上依次查找这个类是不是已经被加载过了,比如java.lang.String是启动类加载器加载的, 你自己也写了一个String类,那么它向上查找的时候发现启动类已经加载过了 就不会在加载了,避免重名重复加载
- 如果一个类没有被加载过 那么就自顶向下 一层层尝试加载,所谓尝试就是每一层看一下能不能加载 能加载就在这一层处理了 ,不能那就往下一层抛(这个设计思想有点类似异常处理,一个异常抛出来 看当前层面能不能catch 能就处理 不能就往上抛)
打破双亲委派机制
自定义类加载器
首先我们需要理解一下双亲委派机制 类加载的源码:
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
// 1. 检查是否已经加载过
Class