【转载】双亲委派模型

news2025/4/21 8:50:30

双亲委派模型是 Java 类加载器的一种工作模式,通过这种工作模式,Java 虚拟机将类文件加载到内存中,这样就保证了 Java 程序能够正常的运行起来。那么双亲委派模型究竟说的是啥呢?接下来我们一起来看。

1.类加载器

双亲委派模型针对的是 Java 虚拟机中三个类加载器的,这三个类加载器分别是:

1.启动类加载器(Bootstrap ClassLoader)

2.扩展类加载器(Extension ClassLoader)

3.应用程序类加载器(Application ClassLoader)

如下图所示:





image.png

这 3 个类加载器的作用如下。

1.1 启动类加载器

启动类加载器(Bootstrap ClassLoader)是由 C++ 实现的,它是用来加载 \jre\lib\rt.jar 和 resources.jar 等 jar 包的,如下图所示:





image.png

接下来我们写个代码测试一下 rt 类加载器的打印:



public class ClassLoaderExample {
    public static void main(String[] args) {
        // rt 类下的 ClassLoader 打印
        System.out.println("rt classloader:" + String.class.getClassLoader());
    }
}

以上程序的执行结果如下图所示:





image.png

问题来了,为什么打印的不是“Bootstrap ClassLoader”而是 null 呢? 这是因为启动类加载器(Bootstrap ClassLoader)是由 C++ 实现的,而这个 C++ 实现的类加载器在 Java 中是没有与之对应的类的,所以拿到的结果是 null。

1.2 扩展类加载器

扩展类加载器是用来加载 \jre\lib\ext 目录下 jar 包的,如下图所示:





image.png

接下来我们使用代码来演示一下 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());
    }
}

以上程序的执行结果如下图所示:





image.png



1.3 应用程序类加载器

应用程序类加载器是用来加载 classpath 也就是用户的所有类的,接下来我们写代码测试一下应用程序类加载器的打印,实现代码如下:



public class ClassLoaderExample {
    public static void main(String[] args) {
        System.out.println("application classloader:" +
                ClassLoaderExample.class.getClassLoader());
    }
}

以上程序的执行结果如下图所示:





image.png



2.双亲委派模型

双亲委派模型的执行流程是这样的: 1、当加载一个类时,会先从应用程序类加载器的缓存里查找相应的类,如果能找到就返回对象,如果找不到就执行下面流程;

2、在扩展加载器缓存中查找相应的类,如果能找到就返回对象,如果找不到就继续下面流程;

3、在启动类加载器中查询相应的类,如果找到就返回对象,如果找不到就继续下面流程;

4、在扩展加载器中查找并加载类,如果能找到就返回对象,并将对象加入到缓存中,如果找不到就继续下面流程;

5、在应用程序类加载器中查找并加载类,如果能找到就返回对象,并将对象加入到缓存中,如果找不到就返回 ClassNotFound 异常。

加载流程如下图所示:





image.png

一般“双亲”指的是“父亲”和“母亲”,而在这里“双亲”指的是类加载类先向上找,再向下找的流程就叫做双亲委派模型。

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 不能通过这个规则进行加载,它需要通过打破双亲委派的模型的方式来加载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1137074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

驱动开发6 IO多路复用——epoll

核心操作&#xff1a;一棵树、一张表、三个接口 相关案例 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys…

2022年12月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 关于Python语言的注释,以下选项中描述错误的是?( ) A: Python语言有两种注释方式:单行注释和多行注释 B: Python语言的单行注释以#开头 C: Python多行注释使用###来做为标记 D: …

RPA为什么会火起来?

RPA的前世今生 RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;&#xff0c;这项技术旨在模拟人类一系列应用软件中执行规则性的任务技术&#xff0c;通过精准、规范且搞笑的自动化处理过程&#xff0c;极大提高了日常业务开展的效率和准…

同一个页面同一区域两个el-table在v-if下样式重叠问题

&#x1f349;正常情况下在radio切换时两个表格的样式应如下 &#x1f349;实际上用v-if显示时会出现以下问题&#xff08;本该属于时间段相同模块的表格却出现在时间段自定义的表格中&#xff09; &#x1f349;解决方案&#xff1a; &#x1f343;一、将v-if替换成v-show(…

零基础Linux_23(多线程)线程安全+线程互斥(加锁)+死锁

目录 1. 线程安全 1.1 线程不安全前期 1.2 线程不安全原因 2. 线程互斥 2.1 加锁保护&#xff08;代码&#xff09; 2.2 锁的本质 3. 可重入对比线程安全 4. 死锁 4.1 死锁的必要条件 4.2 避免死锁 5. 笔试面试题 答案及解析 本篇完。 1. 线程安全 基于上一篇线程…

计算机网络(谢希仁)第八版课后题答案(第三章)

1.数据链路(即逻辑链路)与链路(即物理链路)有何区别? “电路接通了”与”数据链路接通了”的区别何在? 数据链路与链路的区别在于数据链路出链路外&#xff0c;还必须有一些必要的规程来控制数据的传输&#xff0c;因此&#xff0c;数据链路比链路多了实现通信规程所需要的硬…

​​​​​​​如何解决Google play开发者新注册账号,身份验证的地址证明问题?

我们知道&#xff0c;Google Play应用市场的发展速度惊人&#xff0c;但这两年&#xff0c;为了防止恶意软件的传播&#xff0c;谷歌要求开发者账号需要进行身份验证才能发布应用。 而今年越来越严格&#xff0c;不仅在提审时需要进行电话验证&#xff08;链接&#xff09;&am…

TCP三次握手具体过程

四次挥手 1&#xff09;客户端进程发出连接释放报文&#xff0c;并且停止发送数据。释放数据报文首部&#xff0c;FIN1&#xff0c;其序列号为sequ&#xff08;等于前已经传送过来的数据的最后一个字节的序号加1)&#xff0c;此时&#xff0c;客户端进入FIN_WAIT_1&#xff08…

Echarts柱状图渐变色问题变通

问题背景 设计稿中给出了如下图的效果&#xff0c;在柱状图的最上面给出了一个白色的小块&#xff0c;起初我一直在思考亦或者搜索相关的问题&#xff1a;如何在Echarts柱状图顶部实现一个24*4的白色矩形块。始终不得其解&#xff0c;在一个吃饭的瞬间冒出来一个想法是否可以用…

图像的特征点描述与提取

一、说明 特征点算法是图像处理中主要算法之一&#xff0c;它是图像物体匹配的关键步骤&#xff0c;因此&#xff0c;是个极其重要的题目&#xff0c;至今依旧研究不断&#xff0c;本篇讲述历年来学者在领域研究的突出贡献&#xff0c;即六种不同的特征点提取办法&#xff0c;供…

Python------学生管理(文件txt处理)

项目&#xff1a;Python实现学生管理系统 注&#xff1a;免费源码下载 项目介绍&#xff1a; 功能描述&#xff1a;&#xff08;1&#xff09;添加学生信息&#xff08;2&#xff09;删除学生信息&#xff08;3&#xff09;修改学生信息&#xff08;4&#xff09;查询学生信息…

JVM(Java Virtual Machine)G1收集器篇

前言 本文参考《深入理解Java虚拟机》&#xff0c;本文主要介绍G1收集器的收集思想和具体过程&#xff08;填上一篇文章留下的坑&#xff09; 本系列其他文章链接&#xff1a; JVM&#xff08;Java Virtual Machine&#xff09;内存模型篇 JVM&#xff08;Java Virtual Machi…

绿米Aqara S1【妙控开关 S1E】的破解方法---续篇

概述 上接第一篇《绿米Aqara S1【妙控开关 S1E】的破解方法》。 链接地址如下: 绿米Aqara S1【妙控开关 S1E】的破解方法-CSDN博客 上篇主要讲述了,绿米S1E这款硬件的基本组成及TTL线的线序,并获取到了对应的串口打印信息。 此篇重点讲解,如何进入其系统,并开启访问权…

【经验分享】在WSL中使用USB设备

具体步骤&#xff1a; 首先在windows中安装 USBIP 工具&#xff0c;在GitHub上下载安装包并根据README文档的说明进行操作&#xff1a; 下载链接&#xff1a;https://github.com/dorssel/usbipd-win/releases 同时在 WSL Linux 端也需要安装编译内核所需的库和工具&#xff0c…

【微信小程序】实现投票功能(附源码)

一、Vant Weapp介绍 Vant Weapp 是一个基于微信小程序的组件库&#xff0c;它提供了丰富的 UI 组件和交互功能&#xff0c;能够帮助开发者快速构建出现代化的小程序应用。Vant Weapp 的设计理念注重简洁、易用和高效&#xff0c;同时提供灵活的定制化选项&#xff0c;以满足开发…

电动汽车租赁平台【EV Mobility】申请875万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国的电动汽车租赁平台【EV Mobility】近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为(EVMO) &#xff0c…

举个栗子!Quick BI 技巧(3):创建趋势分析表

上一期举个栗子为数据粉们分享了如何简单几步创建柱线图&#xff0c;有一些数据想了解如何在 Quick BI 中制作趋势分析表。 趋势分析表由趋势分析图和趋势分析明细表组成&#xff0c;可以通过趋势分析图查看指标的宏观趋势&#xff0c;通过趋势分析表查看指标详情&#xff0c;…

macOS Sonoma 14.1正式版(23B74)发布(可下载黑白苹果镜像)

系统介绍 黑果魏叔苹果今天为 macOS Sonoma 推出了 14.1 版本更新&#xff0c;魏叔发现&#xff0c;本更新主要改善了 Apple Music 界面&#xff0c;设置中新增保修状态&#xff0c;并修复了多项错误内容。 根据苹果的新说明&#xff0c;这次的 Mac 更新不仅提供了一系列的改善…

博睿数据亮相GOPS全球运维大会上海站!

10月26日&#xff0c;博睿数据携核心产品新一代一体化智能可观测平台 Bonree ONE 亮相第二十一届 GOPS 全球运维大会上海站&#xff0c;展示博睿数据在智能运维领域的科技实力与创新成果。同时&#xff0c;博睿数据AIOps首席专家兼产品总监贺安辉在AIOps最佳实践及解决方案专场…