什么是双亲委派模型?
双亲委派模型:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。

使用双亲委派模型来组织类加载器之间的关系,有一个很明显的好处,就是Java类随着它的类加载器(说白了,就是它所在的目录)一起具备了一种带有优先级的层次关系,这对于保证Java程序的稳定运作很重要。例如,类java.lang.Object类存放在JDK\jre\lib下的rt.jar之中,因此无论是哪个类加载器要加载此类,最终都会委派给启动类加载器进行加载,这边保证了Object类在程序中的各种类加载器中都是同一个类。



为什么要打破双亲委派模型?

举一个最常见的例子:我们常用数据库驱动Driver接口,Driver定义在jdk当中,当其实现却是各个数据库服务商,例如,mysql的MYSQL CONNECROR,所有这就有个问题,DriverManger要加载各个Driver接口实现类,然后进行管理,但是DriverManager是由启动类加载器进行加载的,而这个启动类加载器默认值加载JAVA_HOME下面的lib,但我们真正要加载的是各个实现类,需要有系统类加载器进行加载,这个时候就需要启动类加载器委托系统类加载器去加载Driver实现类,从而破坏了双亲委派。

最常见的打破双亲委派模型示例:
JNDI 通过引入线程上下文类加载器,可以在 Thread.setContextClassLoader 方法设置,默认是应用程序类加载器,来加载 SPI 的代码。有了线程上下文类加载器,就可以完成父类加载器请求子类加载器完成类加载的行为。打破的原因,是为了 JNDI 服务的类加载器是启动器类加载,为了完成高级类加载器请求子类加载器(即上文中的线程上下文加载器)加载类。
Tomcat,应用的类加载器优先自行加载应用目录下的 class,并不是先委派给父加载器,加载不了才委派给父加载器。打破的目的是为了完成应用间的类隔离。
OSGi,实现模块化热部署,为每个模块都自定义了类加载器,需要更换模块时,模块与类加载器一起更换。其类加载的过程中,有平级的类加载器加载行为。打破的原因是为了实现模块热替换。
JDK 9,Extension ClassLoader 被 Platform ClassLoader 取代,当平台及应用程序类加载器收到类加载请求,在委派给父加载器加载前,要先判断该类是否能够归属到某一个系统模块中,如果可以找到这样的归属关系,就要优先委派给负责那个模块的加载器完成加载。打破的原因,是为了添加模块化的特性。

打破双亲委派模型的方式:
1.继承ClassLoader这样一个抽象类,然后重写里面loadClass方法,在这个里面可以自定义要加载的类使用的类加载器。
2.使用线程的上下文加载器,可以通过java.lang.Thread类的setContextClassLoader()这个方法去设置当前类加载器的一个类型。

总结:
1.java 的类加载,就是获取.class文件的二进制字节码数组并加载到 JVM 的方法区,并在 JVM 的堆区建立一个用来封装 java 类相关的数据和方法的java.lang.Class对象实例。
2.java默认有的类加载器有三个,启动类加载器(BootstrapClassLoader),扩展类加载器(ExtClassLoader),应用程序类加载器(也叫系统类加载器)(AppClassLoader)。类加载器之间存在父子关系,这种关系不是继承关系,是组合关系。如果parent=null,则它的父级就是启动类加载器。启动类加载器无法被java程序直接引用。
3.双亲委派就是类加载器之间的层级关系,加载类的过程是一个递归调用的过程,首先一层一层向上委托父类加载器加载,直到到达最顶层启动类加载器,启动类加载器无法加载时,再一层一层向下委托给子类加载器加载。
4.双亲委派的目的主要是为了保证java官方的类库<JAVA_HOME>\lib和扩展类库<JAVA_HOME>\lib\ext的加载安全性,不会被开发者覆盖。

如何打破双亲委派模型?打破双亲委派模型示例?什么是双亲委派模型?相关推荐

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

    定义 双亲委派模式的工作原理的是;如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终 ...

  2. 双亲委派机制_史上三次破坏ClassLoader双亲委派机制

    人既会喜逢令人羡慕的幸运,也会遭遇始料不及的失败与磨难.艰难时,不丧失美好的希望:而在成功时,不忘记感恩之心.谦虚之心:人只要有这份心态,任何时候都可以重振旗鼓. 人的一生始于心,终于心. 本篇是继上 ...

  3. 9亿训练集、通用CV任务,微软打造Florence模型打破分类、检索等多项SOTA

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自:机器之心 来自微软的研究者另辟蹊径,提出了一种新的计算机视觉基础模型 Flore ...

  4. 数据结构与算法(6-1)树的存储(树的双亲表示、树的孩子表示及树的双亲孩子表示)

    目录 一.树的双亲表示 存储结构 总代码 二.树的孩子表示 存储结构 总代码 三.树的双亲孩子表示 存储结构 一.树的双亲表示 存储结构 采用结构体数组的形式存储数据. (根结点parent=1:它没 ...

  5. 基于windows中委派的攻击思路(下)-基于资源的约束性委派

    文章目录 1. 前言 2. 技术点 2.1 利用原理: 那么如何获得一个机器账户呢? 如何获得一个有权利修改msDS-AllowedToActOnBehalfOfOtherIdentity? 3. 利 ...

  6. 千亿参数大模型时代,QQ浏览器团队十亿级小模型「摩天」登顶CLUE

    机器之心专栏 作者:Joshua 今年以来,中文 NLP 圈陆续出现了百亿.千亿甚至万亿参数的预训练语言模型,炼大模型再次延续了「暴力美学」.但 QQ 浏览器搜索团队选择构建十亿级别参数量的「小」模型 ...

  7. 千帆大模型实践:手把手教你用千帆大模型平台训练自己的大模型,训练、微调、强化、部署一站式

    文章目录 产品定义 应用场景 场景一:对话沟通 场景二:内容创作 场景三:分析控制 其他场景 文心千帆使用方式 文心千帆产品优势 申请使用流程 申请内测 开通付费 创建应⽤ 大模型推理 发布部署 数据 ...

  8. 打破双亲委派么,怎么打破_质量保证被打破。 这就是我们如何使其像其他所有东西一样敏捷。...

    打破双亲委派么,怎么打破 by Derwin 由Derwin 质量保证被打破. 这就是我们如何使其像其他所有东西一样敏捷. (Quality Assurance is broken. Here's h ...

  9. Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...

  10. 两个小模型就能吊打大模型!北大校友、谷歌华人一作「模型集合」,CNN、Transformer都适用!...

    视学算法报道   编辑:小咸鱼 [新智元导读]华人研究员Wang Xiaofang在Google Research实习期间的研究证明,即使是少量简单模型的集合也可以匹配或超过最先进模型的精度,同时效率 ...

最新文章

  1. 如何利用深度学习知识--快速部署高速目标检测智能小车?
  2. java 替换四个字节的字符 '\xF0\x9F\x98\x84\xF0\x9F)的解决方案
  3. 解决plt.savefig存的图是空白的
  4. java 类的重载_Java自学-类和对象 方法重载
  5. Python动态变量名定义与调用
  6. Boost.MultiIndex 双向映射示例
  7. oracle procedures批量删除带索引条件数据很慢_redis数据结构、持久化、缓存淘汰策略...
  8. wsl2启动桌面_WSL2使用xrdp实现图形桌面
  9. Startlsback常见使用过程中的问题
  10. Oracle数据库——触发器的创建与应用
  11. 新版GitHub客户端上传文件夹教程笔记
  12. JSP内置对象及部分常用方法
  13. JAVA微博文章内容抓取_关于微博数据抓取的实践
  14. vue-动手做个选择城市
  15. 小区门禁系统代码C语言,一套完整的门禁系统(原理图+源程序),包括电源充电...
  16. 用python画星空-用python画星空源代码是什么?
  17. 时尚【女连衣裙秋季新款连衣裙】搭配技巧
  18. AppleID的双重认证
  19. java毕业设计——基于Java+Java ME的无线网络移动端的俄罗斯方块游戏设计与实现(毕业论文+程序源码)——俄罗斯方块游戏
  20. k8s学习-CKA真题-Pod指定节点部署

热门文章

  1. 【微语】第四周(12.07~12.13)
  2. pycharm 设置本地python
  3. 【搭建NextCloud私有云盘服务】采用docker在linux上进行部署,内含nextCloud移植(迁移服务器)方法
  4. 构建php互动页面,第5章+构建PHP互动网页.ppt
  5. JAVA FTP 上传文件
  6. c语言整蛊朋友小程序
  7. 服务器交换机品牌型号,浪潮CN8000系列交换机
  8. BIOS和BootLoader uboot
  9. alooa是华为什么型号_alooa是华为什么型号
  10. vant 验证手机号_【uni app】vant weapp的引入和部分详细调用(表单输入框、验证码、弹出层搭配选择器、地图)...