大家好,我是骄阳,今天我们来聊一下双亲委派机制。
一、什么是双亲委派
当一个类加载器A去加载某个类时,首先判断有没有加载过,如果没有加载过,自己先不加载,一层层向上委托,如果最顶层父加载器在它的类加载路径下找不到目标类,再一层层向下走,最后由A自己去寻找并载入目标类。
二、双亲委派的过程
为什么要从app加载器开始,为什么不直接从引导类加载器开始加载?
因为90%以上都是自己写的类
三、为什么设计双亲委派?
是否可以自定义string类?
public class String { public static void main(String[] args) { System.out.println("-------------------"); } }
为什么不能自定义string类?
一开始让app去加载,app肯定是没有的,委托父类加载器去加载。拓展类也没有,然后委托引导类,引导类可以找到string类(原始string类),虽然原始类和我们写的类不是完全一样的类,但是它找到了(根据全路径=包名+类名去找---->java.lang.string.class),找到了以后就加载返回了,原始类肯定没有main方法,所以当你运行自己写的string类的时候,她就去jvm找,发现找不到main方法(原始类),所以就报错了。
由此,我们可以知道双亲委派的两个好处
1、沙箱安全机制
自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改
2、避免类的重复加载
当父亲已经加载了该类时,子加载器就没有必要再加载一次,保证被加载类的唯一性
四、拓展
全盘负责委托机制
“全盘负责”是指当一个ClassLoder装载一个类时,除非显示的指定使用另外一个ClassLoder,该类所依赖及引用的类也由这个ClassLoder载入。
好啦,今天的内容就到这里啦,如果你喜欢我的分享,可以一键三连支持一下,你的支持就是我更新的动力,我们下期再见。