双亲委派的概念

双亲委派机制的概念

双亲委派(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框架通过自定义类加载器实现模块化,允许同级类加载器互相委托。

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

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

java 复制代码
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类加载的基础机制,理解其原理有助于解决类冲突、安全漏洞及动态加载等问题。

相关推荐
figo10tf11 分钟前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
zhangyi_viva14 分钟前
Spring Boot(七):Swagger 接口文档
java·spring boot·后端
橙露19 分钟前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot
小程故事多_8020 分钟前
Agent Infra核心技术解析:Sandbox sandbox技术原理、选型逻辑与主流方案全景
java·开发语言·人工智能·aigc
冰暮流星20 分钟前
sql语言之分组语句group by
java·数据库·sql
望舒51322 分钟前
代码随想录day25,回溯算法part4
java·数据结构·算法·leetcode
黎雁·泠崖24 分钟前
【魔法森林冒险】3/14 Allen类(一):主角核心属性与初始化
java·开发语言
程序员敲代码吗25 分钟前
Spring Boot与Tomcat整合的内部机制与优化
spring boot·后端·tomcat
黎雁·泠崖28 分钟前
【魔法森林冒险】1/14 项目总览:用Java打造你的第一个回合制冒险游戏
java·开发语言
NuageL34 分钟前
原始Json字符串转化为Java对象列表/把中文键名变成英文键名
java·spring boot·json