类加载机制之双亲委派模型、作用、源码、SPI打破双亲委派模型

news2024/11/29 2:49:09

双亲委派模型

        • 双亲委派工作机制
        • 双亲委派的作用
        • 双亲委派的实现源码
        • SPI打破双亲委派

应用程序是由三种类加载器相互配合,从而实现类加载,除此之外还可以加入自己定义的类的加载器。

类加载器之间的层次关系,称为双亲委派模型(Parents Delegation Model)。该模型要求除了顶层的启动类加载器外,其他的类加载器都要有自己的父类加载器。这里的父类关系一般通过组合关系(Composition)来实现,而不是继承关系(Inheritance)。

在这里插入图片描述

双亲委派工作机制

一个类加载器首先将类加载请求转发到父类加载器,只有当父类加载器无法完成时菜尝试自己加载。

双亲委派的作用
  1. 每个类只会加载一次,解决了各个类加载器加载基础类的统一问题(基础类库由上层的加载器进行加载)
  2. 防止恶意破坏的类加载,内存中不会出现多份同样的字节码的系统类iii,保证Java程序安全稳定运行。

例如:java.lang .object存放在rt.jar中,如果编写另外—个java.lang.Object并放到ClassPath 中,程序可以编译通过。由于双亲委派模型的存在,所以在rt.jar中的Object比在ClassPath 中的 Object 优先级更高,因为rt.jar中的object使用的是启动类加载器,而ClassPath中的 object使用的是应用程序类加载器。rt.jar中的Object优先级更高,那么程序中使用的所有的 Object都是由启动类加载器所加载的Object 。

双亲委派的实现源码

以下是抽象类 java.lang.ClassLoader的代码片段,其中的loadClass()方法运行过程如下:先检查类是否已经加载过,如果没有则让父类加载器去加载。当父类加载器加载失败时抛出 ClassNotFoundException,此时尝试自己去加载。

public abstract class ClassLoader{
    //The parent class loader for delegation
    private final ClassLoader parent;
    
    public Class<?> loadClass(String name) throws ClassNotFoundException{
        return loadClass(name,false);
    }
    
    protected Class<?> loadClass(String name,boolean resolve) throws ClassNotFoundException{
        synchronized (getClassLoadingLock(name)){
            //First,check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if(c == null){
                try{
                    if (parent != null){
                        c = parent.loadClass(name,false);
                    }else{
                        c = findBootstrapClassOrNull(name);
                    }
                }catch (ClassNotFoundException e){
                     //ClassNotFoundException thrown if class not foundl from the non-null parent class loader
                }
                
                if (c == null){
                    // If still not found,then invoke findclass in orderll to find the class.
					c = findClass(name);
                }
            }
            if(resolve){
                resolveClass(c);
            }
            return c;
        }
    }
    protected Class<?> findClass(String name) throws ClassNotFoundException{
        throw new ClassNotFoundException(name);
    }
}
SPI打破双亲委派

SPI(Service Provider Interface),是一种服务发现机制,它通过在ClassPath路径下的META-INF/ services文件夹查找文件,自动加载文件里所定义的类。
如下图,SPI核心类定义在rt.jar中(例如:java.lang.Driver接口),所以java.lang.Driver接口本身是由启动类加载器加载,当调用java.lang.Driver接口的实现类时,启动类加载器是无法加载实现类的,这个时候就提供了线程上下文类加载器(Thread context ClassLoader )加载实现类,ThreadcontextClassLoader是可以通过 java.lang.Thread #setcontextclassLoader方法设置类加载器,这样就打破了双亲委派的类加载模式。
在这里插入图片描述

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

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

相关文章

飞腾Ubantu22.04.3安装OpenNebula测试

目前只有one服务能够启动成功&#xff0c;sunstone-server nodejs 构建存在问题。 1.概述 因OpenneBula官方镜像源只有AMD架构的镜像包不存在ARM的镜像包&#xff0c;借此用源码编译进行测试。 2.官网github地址 下载解压存放在服务器上&#xff1a; https://github.com/O…

轻量检测模型PP-PicoDet解析

Paper&#xff1a;PP-PicoDet: A Better Real-Time Object Detector on Mobile Devices official implementation&#xff1a;https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.7/configs/picodet Backbone 作者通过实验发现&#xff0c;ShuffleNetV2在移动…

2024第一篇: 架构师成神之路总结,你值得拥有

大家好&#xff0c;我是冰河~~ 很多小伙伴问我进大厂到底需要怎样的技术能力&#xff0c;经过几天的思考和总结&#xff0c;终于梳理出一份相对比较完整的技能清单&#xff0c;小伙伴们可以对照清单提前准备相关的技能&#xff0c;在平时的工作中注意积累和总结。 只要在平时…

Apache Commons BCEL与Java字节码操作

第1章&#xff1a;Apache Commons BCEL简介 大家好&#xff0c;我是小黑&#xff0c;咱们今天来聊聊Apache Commons BCEL&#xff08;Byte Code Engineering Library&#xff09;。你可能会问&#xff0c;BCEL是什么鬼&#xff1f;别急&#xff0c;小黑这就给你娓娓道来。BCEL…

Hadoop入门学习笔记——八、数据分析综合案例

视频课程地址&#xff1a;https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接&#xff1a;https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记&#xff08;汇总&#xff09; 目录 八、数据分析综合案例8.1. 需求分析8.1.1. 背景介绍8.1.2…

基于Python实现二手房整体情况可视化分析+房价预测【500010099】

项目描述 通过房天下兰州二手房信息&#xff0c;对数据进行进一步清洗处理&#xff0c;分析各维度的数据&#xff0c;筛选对房价有显著影响的特征变量&#xff0c;探索兰州二手房整体情况、价格情况和价格的影响因素&#xff0c;建立房价预测模型。 提出问题 探究单价、数量…

SVN服务端的下载、安装

地址 &#xff1a; Apache Subversion Binary Packages 下载 点击 VisualSVN 安装 都是点击 next 点击next &#xff0c;即可安装成功

代码随想录算法训练营第五十七天|647. 回文子串、516.最长回文子序列、动态规划总结篇

代码随想录 (programmercarl.com) 647. 回文子串 1.dp数组及下标含义 我们在判断字符串S是否是回文&#xff0c;那么如果我们知道 s[1]&#xff0c;s[2]&#xff0c;s[3] 这个子串是回文的&#xff0c;那么只需要比较 s[0]和s[4]这两个元素是否相同&#xff0c;如果相同的话&…

矩阵式键盘按键音

#include<reg51.h> //包含51单片机寄存器定义的头文件 sbit soundP3^7; //将sound位定义为P3.7 /************************************************************** 函数功能&#xff1a;蜂鸣器发声延时约120ms *************************************************…

Linux 内核调试

文章目录 一、方法论 一、方法论 qemu 虚拟机 Linux内核学习 Linux 内核调试 一&#xff1a;概述 Linux 内核调试 二&#xff1a;ubuntu20.04安装qemu Linux 内核调试 三&#xff1a;《QEMU ARM guest support》翻译 Linux 内核调试 四&#xff1a;qemu-system-arm功能选项整…

大数据毕业设计:租房推荐系统 python 租房大数据 爬虫+可视化大屏 计算机毕业设计(附源码+文档)✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

年度征文|回顾2023我的CSDN

一年转眼而逝&#xff0c;回顾这一年在csdn的创作&#xff0c;学习&#xff0c;记录历程。回顾过去&#xff0c;才能展望未来&#xff0c;首先看图说话。 今年在csdn的访问量已由年初的2万到年末的50w。粉丝有年初的300个左右&#xff0c;增加到4000个左右。我年初的目标是粉丝…

Dockerfile语法和简单镜像构建

Dockerfile是一个用于定义Docker镜像的文本文件&#xff0c;包含了一系列的指令和参数&#xff0c;用于指示Docker在构建镜像时应该执行哪些操作&#xff0c;例如基于哪个基础镜像、复制哪些文件到镜像中、运行哪些命令等。 Dockerfile文件的内容主要有几个部分组成&#xff0c…

算法——BFS解决FloodFill算法

什么是FloodFill算法 中文&#xff1a;洪水灌溉。假设这一块4*4的方格是一块土地&#xff0c;有凸起的地方&#xff0c;也有凹陷的地方&#xff08;凹陷的地方用负数表示&#xff09;。此时下大雨发洪水&#xff0c;会把凹陷的地方填满。绿色圈起来的属于一块区域&#xff08;…

caj转换成pdf有哪些方法?

caj转换成pdf有哪些方法&#xff1f;PDF是一个被广泛支持的文件格式&#xff0c;这种格式基本上在所有的操作系统和设备上都是支持使用的&#xff0c;也能够将PDF文件打开和查看的&#xff0c;相比于caj文件&#xff0c;它就只能通过一下特定的软件或者是插件才能够将caj打开或…

3.2.1CURRENT 、3.2.2-SNAPSHOT、3.1.7GA 这三者的springboot版本之前有什么区别

在Spring Boot中&#xff0c;版本号通常遵循主要版本.次要版本.修补版本的格式&#xff0c;有时后面会跟着一个额外的标签来表示版本的特殊性质。根据您提供的版本号 “3.2.1CURRENT”、“3.2.2-SNAPSHOT” 和 “3.1.7GA”&#xff0c;我们可以解释这些版本的含义和它们之间的区…

用贪心算法编程求解任务安排问题

题目&#xff1a;用贪心算法编程求解以下任务安排问题 一个单位时间任务是恰好需要一个单位时间完成的任务。给定一个单位时间任务的有限集S。关于S的一个时间表用于描述S中单位时间任务的执行次序。时间表中第1个任务从时间0 开始执行直至时间1 结束&#xff0c;第2 个任务从时…

react-router-dom5升级到6

前言 升级前版本为5.1.2 下载与运行 下载 npm install react-router-dom6运行 运行发现报错: 将node_modules删除&#xff0c;重新执行npm i即可 运行发现如下报错 这是因为之前有引用react-router-dom.min&#xff0c;v6中取消了该文件&#xff0c;所以未找到文件导致报错。…

鸿蒙4.0开发实战(ArkTS)-闹钟制作

闹钟功能要求 展示指针表盘或数字时间。添加、修改和删除闹钟。展示闹钟列表&#xff0c;并可打开和关闭单个闹钟。闹钟到设定的时间后弹出提醒。将闹钟的定时数据保存到轻量级数据库。 闹钟主界面 闹钟界面包括当前时间、闹钟列表、添加闹钟子组件&#xff0c;具体包括以下…

游戏缺少emp.dll详细修复教程,快速解决游戏无法启动问题

在现代游戏中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“emp.dll丢失”。emp.dll是一个动态链接库文件&#xff0c;它包含了许多程序运行所需的函数和数据。当一个程序需要调用这些函数时&#xff0c;系统会从emp.dll文件中加载相应的内容。因此&#x…