类加载器系列二:什么是双亲委派机制以及原理

大家好,我是骄阳,今天我们来聊一下双亲委派机制。

一、什么是双亲委派

当一个类加载器A去加载某个类时,首先判断有没有加载过,如果没有加载过,自己先不加载,一层层向上委托,如果最顶层父加载器在它的类加载路径下找不到目标类,再一层层向下走,最后由A自己去寻找并载入目标类。

类加载器系列二:什么是双亲委派机制以及原理_第1张图片

二、双亲委派的过程

类加载器系列二:什么是双亲委派机制以及原理_第2张图片

为什么要从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载入。

好啦,今天的内容就到这里啦,如果你喜欢我的分享,可以一键三连支持一下,你的支持就是我更新的动力,我们下期再见。

你可能感兴趣的:(jvm,java,开发语言)