双亲委派机制 Parent Delegation Model,又称为父级委托模型。想要了解它,还需理解类加载机制、类加载器、类加载器的层级关系。
类加载机制:编译器把Java源文件编译成.class文件,再由JVM装载.class文件到内存中,JVM装载完成后得到一个Class对象字节码。有了字节码对象,接下来就可以实例化使用了。
类的加载器主要有启动类加载器、附加类加载器、应用类加载器、用户自定义加载器。
启动类加载器,是用来加载jdk\jre\lib下的核心类库,比如rt.jar、resources.jar等。
扩展类加载器,是用来加载jdk\jre\lib\ext下的扩展类库中的jar包和.class文件。
应用类加载器,则用来加载classpath下的jar包和.class文件。还有自定义加载器,也属于应用类加载器。
双亲委派机制,是按照加载器的层级关系,逐层进行委派。
要加载一个类MyClass.class,从低层级到高层级一级一级委派,先由应用层加载器委派给扩展类加载器,再由扩展类委派给启动类加载器;启动类加载器载入失败,再由扩展类加载器载入,扩展类加载器载入失败,最后由应用类加载器载入,如果应用类加载器也找不到那就报ClassNotFound异常了。
双亲委派机制的优点:
1.保证安全性,层级关系代表优先级,也就是所有类的加载,优先给启动类加载器,这样就保证了核心类库类。
2.避免重复,如果父类加载器加载过了,子类加载器就没有必要再去加载了。
双亲委派机制
双亲委派机制指,当某个特定的类加载器在收到类加载的请求时,会遵循下面的规则顺序:
先判断被加载的类是否加载过,如果是则结束,否则会将加载任务委托给自己的父亲;
父类加载器在收到类加载的请求时,也先判断被加载的类是否加载过,如果是则结束,否则同样将加载任务委托给自己的父亲
不断的循环进行步骤2,直到将加载任务委托给Bootstrap ClassLoader为止。此时,Bootstrap ClassLoader 会先判断被加载的类是否加载过,如果是则结束;
请注意,到这里为止,都只是在转移加载任务的请求,下面将会进行类加载。
Bootstrap ClassLoader会判断能否完成加载任务,如果能则直接加载,否则会将加载任务交给子类加载器;
子类加载器也会判断能否完成加载任务,如果能则直接加载,否则会再一次将加载任务交给子类加载器;
不断的循环进行步骤2,直到最后一个类加载器,如果这个类加载器仍然不能够加载这个类,就会抛出一个异常:ClassNotFoundException。