双亲委派模型

Java双亲委派模型 在这个模型中,类加载器(ClassLoader)之间存在一种层次关系,当一个类加载器收到加载类的请求时,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到对应的类)时,子加载器才会尝试自己去加载。:它是最顶层的类加载器,主要负责加载 Java 的核心库(如 java.lang 包中的类),这个加载器是用本地代码(C/C++)实现的,它没有父加载器,是虚拟机自身的一部分。 阅读详情

从 Java 虚拟机的角度来讲,只存在以下两种不同的类加载器:

  1. 启动类加载器(Bootstrap ClassLoader),使用 C++ 实现,是虚拟机自身的一部分;
  2. 所有其它类的加载器,使用 Java 实现,独立于虚拟机,继承自抽象类 java.lang.ClassLoader

从Java开发人员的角度来看,可分为以下三种类加载器;

  1. 启动类加载器(Bootstrap ClassLoader):这个类加载器负责将存放在 <JRE_HOME>\lib 目录中的,或者被-Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar,名字不符合的类库即使放在 lib 目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被 Java 程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给启动类加载器,直接使用 null 代替即可
  2. 扩展类加载器(Extension ClassLoader):这个类加载器是由sun.misc.Launcher$ExtClassLoader实现的。它负责将 <JAVA_HOME>\lib\ext 或者被 java.ext.dirs 系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。
  3. 应用程序类加载器(Application ClassLoader):这个类加载器是由 sun.misc.Launcher$AppClassLoader实现的。由于这个类加载器是 ClassLoader 中的 getSystemClassLoader() 方法的返回值,因此一般称为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

双亲委派模型

上图中类加载器之间的这种层次关系,称之为类加载器的双亲委派模型。除了启动类加载器,其余的类加载器都应当有自己的父类加载器。这里类加载器之间的父子关系一般不会以继承的关系来实现,而是都使用组合关系来复用父加载器的代码。

工作过程:

一个类加载器收到了类加载的请求,首先不会自己去尝试加载这个类,而是把请求委派给父类加载器去完成,每个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成请求时,子加载器才会尝试自己去加载。

优势:

Java类随着它的类加载器一起具备了一种带有优先级的层次关系。

例如类java.lang.Object,它存放在rt.jar中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类。

相反,如果没有使用双亲委派模型,由各个类加载器自己去加载的话,如果用户自己编写了一个称为java.lang.Object的类,并放在程序的Classpath中,那系统中将会出现多个不同的Object类,Java类型体系中最基础的行为也就无法保证。

实现:

//双亲委派模型的实现

protected synchronized Class<?> loadClass(String name,boolean resolve) throws    ClassNotFoundException{
    //首先,检查请求的类是否已经被加载过了
    Class c = findLoadedClass(name);
    if(c==null){
        try{
        if(parent!=null){
            c = parent.loadClass(name,false);
        }else{
            c = findBootstrapClassOrNull(name);
        }
        }catch (ClassNotFoundException e){
            //如果父类加载器抛出ClassNotFoundException 
            //说明父类加载器无法完成加载请求    
        }
        if(c==null){
            //在父类加载器无法加载的时候
            //再调用本身的findClass方法来进行类加载
            c = findClass(name);    
        }
        }
    if(resolve){
        resolveClass(c);    
    }
    return c;
}

 

手把手教你理解特斯拉Model 3的域控制器架构:RBCM如何成为“多面手”? 本文深入解析特斯拉Model 3的域控制器架构,重点介绍右车身域控制器(RBCM)如何整合车身电子系统功能。RBCM作为多任务处理中枢,管理空调系统、尾部电气设备和超声波雷达等关键功能,展现了特斯拉在汽车电子架构上的创新设计。文章详细探讨了RBCM的硬件架构、功能版图及信号网络,揭示其如何通过高性能MCU和智能开关技术实现功能集中与效率提升。 阅读详情

相关推荐

ArcGIS实战:用栅格数据为偏远山区规划一条最省钱的公路(附完整数据与操作步骤)

本文详细介绍了如何利用ArcGIS进行栅格数据分析,为偏远山区规划一条最省钱的公路。通过DEM高程数据处理、成本权重设定和最佳路径计算,结合真实案例展示了从数据准备到工程方案转化的完整流程,帮助工程师在复杂地形中做出经济高效的路线决策。

weixin_32136203的博客 357

【JVM】双亲委派模型

之所以这个东西面试出场概率高高,最大的原因就是它起的名字很好听描述了查找.class文件的策略。

Yeeear的博客 1万+

百度飞桨EasyDL图像分类:收费口车辆类型自动识别

车辆类型识别在高速收费路口的应用中,场景相对单一且拍摄角度一致,因此首次训练模型效果优异,准确率达到了95%,鉴于市面上的车辆类型不断更新迭代且部分车辆的主要特征也不断发生变化,因此可在模型投入应用后,持续收集模型实际运行过中产生的数据,定期添加数据进行模型迭代,保证模型效果。企业将AI模型应用到实际场景中以实现停车费用、过路费用的自动计算,在收费口中由相机对每个车辆进行拍摄,拍摄到的图片传输到预测设备上进行类型识别,基于识别出来的车辆类型自动进行费用计算。该功能可在发起训练时选选择对应的开关打开即可。..

PaddlePaddle 1673

一文搞懂双亲委派模型

类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取此类的二进制字节流”这个动作放到 Java 虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。 从 Java 虚拟机的角度来讲,只存在以下两种不同的类加载器: 启动类加载器(Bootstrap ClassLoader),使用 C++ 实现,是虚拟机自身的一部分 所有其它类的加载...

To be a great coder 2万+

链路监控pinpoint3.0.3安装部署(2)

本文详细介绍了Pinpoint 3.0.3分布式链路监控系统的安装部署过程。主要内容包括:1)数据库安装(HBase、MySQL、Redis、Pinot)的详细配置步骤;2)中间件Zookeeper和Kafka的安装;3)Pinpoint三大组件的部署:Collector、Web和Batch的配置文件修改和启动脚本。文章特别强调了使用-starter-exec.jar包的重要性,并提供了各组件所需的详细参数配置,包括数据库连接、Zookeeper地址、Kafka配置等关键信息。

zouzou_888的博客 1376

vue3接入大华摄像头

┃ ┃ ┣ 📜PlaybackModal.vue 回放列表模态框。┃ ┃ ┗ 📜VideoGrid.vue 视频播放区域。┃ ┃ ┣ 📜ControlPanel.vue 控制面板。┃ ┃ ┣ 📜DeviceList.vue 设备列表。┃ ┣ 📂module //大华摄像头文件。

💻 专注 Vue 前端与 Java 后端技术 🌱 目前正在深入 Spring Boot、微服务与性能优化 📝 定期分享实战踩坑经验与学习笔记 🤝 欢迎交流,共同进步 915

双亲委派模型是什么,为什么要使用双亲委派模型

在Java中,类加载器(ClassLoader)是负责将类文件加载到JVM中的关键组件。为了确保类加载过程的安全性和稳定性,Java引入了一种叫做双亲委派模型(Parent Delegation Model)的机制。这篇文章将介绍什么是双亲委派模型,以及为什么要使用这种模型。

常备不懈 2133

vue 获取el-table多选的选中行

<el-table :data='tableData' ref="multipleTable" v-loading='loading' border max-height='700' style='width: 100%' size="mini"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column label

且听风吟的博客 6649

双亲委派模型和破坏性双亲委派模型详解

从JVM的角度来看,只存在两种类加载器: 启动类加载器(Bootstrap ClassLoader):由C++语言实现(针对HotSpot),负责将存放在<JAVA_HOME>\lib目录或-X bootclasspath参数指定的路径中的类库加载到内存中。 其他类加载器:由Java语言实现,继承自抽象类ClassLoader。 如:扩展类加载器(Extension Clas...

Jack博客 7108

(功能安全六)硬件FMEDA计算

FMEDA(故障模式、影响与诊断分析)是功能安全验证的核心方法,通过量化分析硬件故障模式及其影响,计算SPFM、LFM、PMHF等关键指标。分析过程包含六大步骤:计算元器件失效率、识别故障模式、评估安全机制诊断覆盖率、分类计算各类失效率、量化指标计算及设计优化。输入需要系统架构图、硬件故障模式清单等资料,输出安全指标达标情况及改进建议,确保设计满足ASIL等级要求。该方法通过系统化的故障分类和量化评估,为硬件安全设计提供科学依据。

Dayongger的博客 1453

【SpringBoot 3.x 第43节】你还敢说 Spring 启动慢是“宿命”?Spring AOT 把启动剧本都提前写死了,你服不服?

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。

**My Coding Family** 543

如何破坏双亲委派模型

起源来自于网易面试官的一个问题,一个类的静态块是否可能被执行两次。众所周知类加载的初始化阶段会自动收集类中所有类变量的赋值动作与静态语句块中的语句生成一个()方法,这个方法只会被执行一次。因此通常的理解类的静态语句块只会被执行一次。但感觉事情应该不会那么简单,在虚拟机中区分类是由类本身与加载类的类加载器决定的,猜想,同一个类被不同的类加载器加载,会执行两次静态块吗.? 失败的尝试 由于...

tinysakura的博客 1万+

SAP会计凭证导入ABAP开发模板+注意点—附带源码

开发并不仅仅只要考虑实现的功能,只实现功能的是程序,考虑到使用场景的是工程。使用bapi校验创建会计凭证的数据,报错和参数和正式创建一致。用途,防止产生错误的凭证,即使财务凭证可以冲销。正式创建会计凭证。隐藏的坑。

小九啥也不会 1233

【JVM】双亲委派模型、优势及如何破坏双亲委派模型

** 一、基本概念 一个类是由加载它的类加载器和这个类本身来共同确定其在Java虚拟机中的唯一性。 ** 二、什么是双亲委派模型 类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。 双亲委派模型要求除了最顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器,在双亲委派模型中...

Steven_L_的博客 2217

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java双亲委派模型是什么、优势在哪、双亲委派模型的破坏

Java双亲委派模型是什么、优势在哪、双亲委派模型的破坏 前言 双亲委派模型是Java加载类的机制.采用双亲委派模型的好处是Java类随着它的类加载器一起具备了一种带有优先级的层级关系,通过这种层级关系可以避免类的重复加载. Bootstrap ClassLoader(启动类加载器):负责将%JAVA_HOME%/lib目录中或-Xbootclasspath中参数指定的路径...

weixin_41563161的博客 1345

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

学习日志:双亲委派模型

类加载器有很多种,当我们想要加载一个类的时候,具体是哪个类加载器加载呢?这就需要提到双亲委派模型了。ClassLoader 类使用委托模型来搜索类和资源。双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器。ClassLoader 实例会在试图亲自查找类或资源之前,将搜索类或资源的任务委托给其父类加载器。

weixin_46117680的博客 1227

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

什么是双亲委派模型?

我们可以通过继承。

smart_an的专栏 1112

深入JVM 双亲委派模型

从虚拟机角度看,只存在2种不同的类加载器: 一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身一部分; 一种是所有其他的类加载器,使用Java语言实现,独立于虚拟机,继承于java.lang.ClassLoader 从Java开发人员的角度来看,类加载器可进一步划分,一般情况下提供3种系统的类加载器 ——启动类加载器(Bootstr...

一只老风铃 3877

【JVM】教会你双亲委派模型

双亲委派模型以及类加载器,一篇文章即可秒懂~【JVM】含java代码

Jilit_jilit的博客 1467

【Java基础】JVM双亲委派模型

jvm的双亲委派模型为了解决什么问题,你真的搞懂了吗?还没懂的话,请看这篇

软件工程探索之旅 998

浅谈双亲委派模型

浅谈双亲委派模型1.类加载器1.1什么是类加载器1.2几种主要的类加载器1.3加载顺序2.双亲委派模型2.1什么是双亲委派模型2.2双亲委派模型的工作过程2.3图例解释如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流...

KILLERQUEEN_的博客 763
上一篇: Java类加载的过程
下一篇: 并发编程——如何减少上下文切换
AE86上山啦
博客等级 码龄8年 5粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值