news 2026/6/11 17:56:40

双亲委派的概念

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
双亲委派的概念

双亲委派机制的概念

双亲委派(Parent Delegation)是Java类加载器(ClassLoader)的一种工作模型,用于保证类的唯一性和安全性。核心思想是:当一个类加载器收到加载类的请求时,会先将请求委派给父类加载器处理,只有父类加载器无法完成加载时,子加载器才会尝试自己加载。

双亲委派的工作流程

  1. 委派父加载器
    类加载器在加载类时,不会立即尝试自己加载,而是递归地将请求向上委派给父类加载器(如Bootstrap ClassLoaderExtension ClassLoaderApplication ClassLoader)。
  2. 父加载器处理
    父类加载器检查是否已加载过该类,若已加载则直接返回;若未加载,则尝试在其搜索路径中查找并加载。
  3. 子加载器兜底
    若所有父加载器均无法加载该类(如父加载器的搜索路径中不存在该类),子加载器才会调用自身的findClass()方法在指定路径中加载。

双亲委派的优势

  • 避免重复加载
    通过层级委派确保类仅被加载一次,防止内存中出现多份相同的类定义。
  • 安全性保障
    防止用户自定义类覆盖核心类库(如java.lang.String),确保Java核心API的完整性。
  • 职责明确
    不同层级的类加载器负责特定范围的类加载(如Bootstrap加载JRE/lib,Extension加载JRE/lib/ext)。

打破双亲委派的场景

  1. SPI(Service Provider Interface)
    如JDBC驱动加载,核心接口由Bootstrap加载,但实现类需由应用类加载器加载。通过Thread.currentThread().getContextClassLoader()获取线程上下文加载器绕过委派。
  2. 热部署
    如OSGi框架通过自定义类加载器实现模块化,允许同级类加载器互相委托。

代码示例:自定义类加载器

以下是一个违反双亲委派的自定义类加载器(优先自己加载):

public class CustomClassLoader extends ClassLoader { @Override protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { // 1. 检查是否已加载 Class<?> c = findLoadedClass(name); if (c == null) { try { // 2. 优先自己加载(打破委派) c = findClass(name); } catch (ClassNotFoundException e) { // 3. 失败后再委派父加载器 c = super.loadClass(name, resolve); } } if (resolve) { resolveClass(c); } return c; } }

双亲委派的局限性

  • 灵活性不足
    某些场景(如动态模块化)需要更灵活的加载方式,双亲委派的层级结构可能成为限制。
  • 上下文传递问题
    父加载器无法直接访问子加载器的资源,需通过上下文加载器间接解决。

双亲委派是Java类加载的基础机制,理解其原理有助于解决类冲突、安全漏洞及动态加载等问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 21:31:10

海外网红推广中的品牌声誉保护与危机处理机制

随着品牌出海规模不断扩大&#xff0c;海外网红推广已成为企业触达全球消费者最直接、最高效的方式之一。然而&#xff0c;红人合作的开放性、舆论传播的不可控性、跨文化解读的复杂性&#xff0c;使得品牌声誉保护成为企业在全球营销中的首要挑战。如果品牌缺乏稳固的危机处理…

作者头像 李华
网站建设 2026/6/11 0:12:48

基于.Net 8创建 CAD勘测定界图(三)——界址点标注+边长标注

好的&#xff0c;之前的两篇文章大概介绍了一下关于做这个功能的背景和关于Aspose.CAD For .Net填充无效&#xff0c;转用ACadSharp创建红线和界址点符号的内容&#xff0c;具体看&#xff1a; 基于.Net 8创建 CAD勘测定界图&#xff08;一&#xff09; 基于.Net 8创建 CAD勘测…

作者头像 李华
网站建设 2026/6/11 0:11:32

Qwen3-VL-235B-A22B:2025多模态AI革命,从看懂到行动的跨越

Qwen3-VL-235B-A22B&#xff1a;2025多模态AI革命&#xff0c;从看懂到行动的跨越 【免费下载链接】Qwen3-VL-235B-A22B-Instruct 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-VL-235B-A22B-Instruct 导语 阿里通义千问团队推出的Qwen3-VL-235B-A22B-Ins…

作者头像 李华
网站建设 2026/6/10 1:04:43

DiT模型压缩实战:从实验室到边缘设备的智能部署方案

DiT模型压缩实战&#xff1a;从实验室到边缘设备的智能部署方案 【免费下载链接】DiT Official PyTorch Implementation of "Scalable Diffusion Models with Transformers" 项目地址: https://gitcode.com/GitHub_Trending/di/DiT 你是否曾经为运行大型AI模型…

作者头像 李华
网站建设 2026/6/10 14:00:07

QButtonGroup (Qt)

。 这里写目录标题介绍添加和删除按钮按钮id获取当前按下的按钮设置QButtonGroup互斥信号和槽介绍 QRadioButton 是用于创建单选按钮的类&#xff0c;它允许用户从一组互斥的选项中选择一个。QButtonGroup 则是一个容器类&#xff0c;用于管理一组按钮&#xff08;通常是 QRad…

作者头像 李华
网站建设 2026/6/10 19:57:22

Apple Silicon Mac跨平台利器:PlayCover让iOS应用原生运行

Apple Silicon Mac跨平台利器&#xff1a;PlayCover让iOS应用原生运行 【免费下载链接】PlayCover Community fork of PlayCover 项目地址: https://gitcode.com/gh_mirrors/pl/PlayCover 想要在M1/M2/M3芯片的Mac上畅玩热门iOS游戏和应用&#xff1f;PlayCover这款开源…

作者头像 李华