关于什么是双亲委派模型的详细解析? ゝ一世哀愁。 2024-03-25 20:32 14阅读 0赞 双亲委派模型是 Java 类加载器的一种工作模式,通过这种工作模式,Java 虚拟机将类文件加载到内存中,这样就保证了 Java 程序能够正常的运行起来。那么双亲委派模型究竟说的是啥呢?接下来我们一起来看。 ### 1.类加载器 ### 双亲委派模型针对的是 Java 虚拟机中三个类加载器的,这三个类加载器分别是: 1. 启动类加载器(Bootstrap ClassLoader) 2. 扩展类加载器(Extension ClassLoader) 3. 应用程序类加载器(Application ClassLoader) 如下图所示: ![format_png][] 这 3 个类加载器的作用如下。 #### 1.1 启动类加载器 #### 启动类加载器(Bootstrap ClassLoader)是由 C++ 实现的,它是用来加载 <JAVA\_HOME>\\jre\\lib\\rt.jar 和 resources.jar 等 jar 包的,如下图所示: ![format_png 1][] 接下来我们写个代码测试一下 rt 类加载器的打印: public class ClassLoaderExample { public static void main(String[] args) { // rt 类下的 ClassLoader 打印 System.out.println("rt classloader:" + String.class.getClassLoader()); } } 复制代码 以上程序的执行结果如下图所示: ![format_png 2][] 问题来了,为什么打印的不是“Bootstrap ClassLoader”而是 null 呢? 这是因为启动类加载器(Bootstrap ClassLoader)是由 C++ 实现的,而这个 C++ 实现的类加载器在 Java 中是没有与之对应的类的,所以拿到的结果是 null。 #### 1.2 扩展类加载器 #### 扩展类加载器是用来加载 <JAVA\_HOME>\\jre\\lib\\ext 目录下 jar 包的,如下图所示: ![format_png 3][] 接下来我们使用代码来演示一下 ext 类加载器,示例代码如下: public class ClassLoaderExample { public static void main(String[] args) { // ext 类下 classloader 打印 System.out.println("ext classloader:" + sun.net.spi.nameservice.dns.DNSNameService.class.getClassLoader()); } } 复制代码 以上程序的执行结果如下图所示: ![format_png 4][] #### 1.3 应用程序类加载器 #### 应用程序类加载器是用来加载 classpath 也就是用户的所有类的,接下来我们写代码测试一下应用程序类加载器的打印,实现代码如下: public class ClassLoaderExample { public static void main(String[] args) { System.out.println("application classloader:" + ClassLoaderExample.class.getClassLoader()); } } 复制代码 以上程序的执行结果如下图所示: ![format_png 5][] ### 2.双亲委派模型 ### 双亲委派模型的执行流程是这样的: 1、当加载一个类时,会先从应用程序类加载器的缓存里查找相应的类,如果能找到就返回对象,如果找不到就执行下面流程; 2、在扩展加载器缓存中查找相应的类,如果能找到就返回对象,如果找不到就继续下面流程; 3、在启动类加载器中查询相应的类,如果找到就返回对象,如果找不到就继续下面流程; 4、在扩展加载器中查找并加载类,如果能找到就返回对象,并将对象加入到缓存中,如果找不到就继续下面流程; 5、在应用程序类加载器中查找并加载类,如果能找到就返回对象,并将对象加入到缓存中,如果找不到就返回 ClassNotFound 异常。 加载流程如下图所示: ![format_png 6][] 一般“双亲”指的是“父亲”和“母亲”,而在这里“双亲”指的是类加载类先向上找,再向下找的流程就叫做双亲委派模型。 ### 3.优缺点分析 ### #### 3.1 优点 #### 双亲委派模型的优点有两个: 1、安全。 2、避免重复加载。 3.1.1 安全 在安全方面的表现时,当使用双亲委派模型时,用户就不能伪造一些不安全的系统类了,比如 jre 里面已经提供了 String 类在启动类加载时加载,那么用户自定义再自定义一个不安全的 String 类时,按照双亲委派模型就不会再加载用户定义的那个不安全的 String 类了,这样就可以避免非安全问题的发生了。 3.1.2 避免重复加载 使用双亲委派模型也可以避免一个类被重复加载,当一个类被加载之后,因为使用的双亲委派模型,这样不会出现多个类加载器都将同一个类重复加载的情况了。 #### 3.2 缺点 #### 双亲委派模型的典型问题是加载 SPI 实现类的场景,比如 JNDI(Java Naming and Directory Interface,Java 命名与目录接口)服务,它的代码由启动类加载器去加载(在 JDK 1.3 时放进 rt.jar),但 JNDI 的目的就是对资源进行集中管理和查找,它需要调用独立厂商实现部部署在应用程序的 classpath 下的 JNDI 接口提供者(SPI, Service Provider Interface)的代码,但启动类加载器不可能“认识”之些代码,这就双亲委派模型的问题,JDBC 也是同样的问题。 ### 总结 ### 双亲委派模型是和 Java 中多个类加载器(启动类加载器、扩展加载器、应用程序类加载器)的运行规则,通过这个(双亲委派模型)规则可以避免类的非安全问题和类被重复加载的问题,但它也遇到了一些问题,比如 JNDI 和 JDBC 不能通过这个规则进行加载,它需要通过打破双亲委派的模型的方式来加载。 [format_png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/f59cddd5e93e4dbbbce0c8ecfe035763.png [format_png 1]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/eb713990639f4924b2d0354b9cb540d7.png [format_png 2]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/45552720b00e43bbb9520ab86ac58d80.png [format_png 3]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/cd53d4d727f6457d9b3f7491cd63a248.png [format_png 4]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/19f6f8f0282e4a448d404a90bff855e1.png [format_png 5]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/19e3029dbc33433299e3eaf1948b84c6.png [format_png 6]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/25/90085f8f2d034a69a90a0900ece847d1.png
相关 破坏双亲委派模型 一 概述 双亲委派模型并不是一个具有强制性约束的模型,而是Java设计者推荐给开发者的类加载方式。Java中的大部分类的加载器都遵循这个模型。例外的是,直到Java模块化 ﹏ヽ暗。殇╰゛Y/ 2022年12月08日 04:46/ 0 赞/ 144 阅读
相关 双亲委派模型 双亲委派模型(图解) ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9 冷不防/ 2022年11月10日 10:43/ 0 赞/ 125 阅读
相关 双亲委派模型 一 定义与本质 类加载器用来把类加载到 Java 虚拟机中。从 JDK1.2 版本开始,类的加载过程采用双亲委派机制,这种机制能更好地保证 Java 平台的安全。 1 左手的ㄟ右手/ 2022年09月06日 14:19/ 0 赞/ 139 阅读
相关 双亲委派模型 说道双亲委派模型,就要从类加载器说起。。。。。。。。。。。 [Java][]虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验、转换解析和初始 亦凉/ 2022年07月12日 13:26/ 0 赞/ 155 阅读
相关 双亲委派模型 其实,双亲委派模型并不复杂。自定义类加载器也不难!随便从网上搜一下就能搜出一大把结果,然后`copy`一下就能用。但是,如果每次想自定义类加载器就必须搜一遍别人的文章,然后复制 落日映苍穹つ/ 2022年05月09日 16:56/ 0 赞/ 175 阅读
相关 双亲委派模型 双亲委派模型 类与类加载器 双亲委派模型 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到 野性酷女/ 2022年03月10日 14:28/ 0 赞/ 202 阅读
相关 双亲委派模型 双亲委派模型 双亲委派模型简介 双亲委派模型实现源码分析 双亲委派模型的好处 双亲委派模型简介 每一个类都有一个对应它的类加载器。系统中的类加载 不念不忘少年蓝@/ 2021年11月10日 14:28/ 0 赞/ 561 阅读
相关 双亲委派模型 双亲委派模型(Since JDK.2): ![这里写图片描述][70] 从虚拟机的角度来看,类加载器主要分为启动类加载器(Bootstrap Classloader)和 £神魔★判官ぃ/ 2021年09月26日 14:36/ 0 赞/ 524 阅读
相关 双亲委派模型 围绕这四个问题去回答一下: 1. 什么是双亲委派模型 2. 为什么会有双亲委派模型 3. 可以打破双亲委派模型? 4. 为什么要打破双亲委派模型? 一、 ╰+攻爆jí腚メ/ 2021年09月25日 11:08/ 0 赞/ 290 阅读
还没有评论,来说两句吧...