详细了解双亲委派机制的原理和作用! ## 一、类加载器 要想了解双亲委派机制,肯定是要先了解类加载器。 #### 概念 Java类加载器(ClassLoader)是Java运行时环境(JRE)的一部分,负责动态的将Java类加载到Java虚拟机的内存空间。 #### 类加载器的种类 - 启动类加载器(Bootstrap ClassLoader):加载Java的核心库(jre/lib/rt.jar),同时加载另外两种类加载器,由C++编写; - 扩展类加载器(Extensions ClassLoader):加载Java的扩展库(jre/ext/*.jar); - 应用类加载器(Application ClassLoader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的; - 用户自定义类加载器(Custom ClassLoader):`java`编写,用户自定义的类加载器,可加载指定路径的`class`文件;  #### 类加载生命周期  #### 类加载器之间的关系  代码示例 上述代码的输出结果为:  结果输出 > 通过这段代码可以看出,我们日常编写的代码,是通过Application ClassLoader加载的,其父类是Extensions ClassLoader。实际上,Bootstrap ClassLoader也是Extensions ClassLoader的父类,但是因为Bootstrap ClassLoader是由C++编写的,在Java中无法获取,所以对外显示为null。 ## 二、双亲委派机制 #### 原理 双亲委派机制指的是,当某个特定的类加载器在收到类加载的请求时,会遵循下面的规则顺序: 1、首先判断被加载的类是否已经加载过,如果是则结束,否则会将加载任务委托给自己的父类; 2、父类加载器在收到类加载的请求时,也会先判断被加载的类是否已经加载过,如果是则结束,否则同样将加载任务委托给自己的父类; 3、不断的循环进行步骤2,直到将加载任务委托给Bootstrap ClassLoader为止。此时,Bootstrap ClassLoader会先判断被加载的类是否已经加载过,如果是则结束; - 请注意,以上三步都是在查询缓存,如缓存中没有才进行类的加载。 4、Bootstrap ClassLoader会判断能否完成加载任务,如果能则直接加载,否则会将加载任务交给子类加载器; 5、子类加载器也会判断能否完成加载任务,如果能则直接加载,否则会再一次将加载任务交给子类加载器; 6、不断的循环进行步骤5,直到最后一个类加载器,如果这个类加载器仍然不能够加载这个类,就会抛出一个异常:ClassNotFoundException。  #### 作用 1、防止重复加载同一个`.class`。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。 2、保证核心`.class`不能被篡改。通过委托方式,不会去篡改核心`.clas`,即使篡改也不会去加载,即使加载也不会是同一个`.class`对象了。不同的加载器加载同一个`.class`也不是同一个`Class`对象。这样保证了`Class`执行安全。 简单来说就是: 1. 首先,保证了java核心库的安全性。如果你也写了一个java.lang.String类,那么JVM只会按照上面的顺序加载jdk自带的String类,而不是你写的String类。 2. 保证同一个类不会被加载多次。 最后修改:2023 年 02 月 24 日 © 允许规范转载 赞 1 如果觉得我的文章对你有用,请随意赞赏