什么是双亲委托模型?

42 篇文章 1 订阅

双亲委托模型(Parent Delegation Model)是Java类加载器(ClassLoader)采用的一种特定的工作方式。在这个模型中,类加载器在尝试加载某个类时,首先会委托给它的父加载器去尝试加载这个类,这个过程会一直递归进行,直到顶层的启动类加载器(Bootstrap ClassLoader)。如果父加载器能够成功加载该类,则返回;如果父加载器无法完成这个任务,那么子加载器才尝试自己去加载这个类。

双亲委托模型的好处

  1. 避免类的重复加载: 由于顶层开始尝试加载,所以同一个类不会被加载多次。

  2. 安全性考虑: 防止核心API被随意篡改。例如,你无法通过自定义一个名为java.lang.Object的类来代替核心库中定义的java.lang.Object类。

类加载器的层级结构

在JVM中,类加载器通常具备以下的层级结构:

  • 启动类加载器(Bootstrap ClassLoader): 这个类加载器加载Java的核心库,是用原生代码实现的,并不继承自java.lang.ClassLoader
  • 扩展类加载器(Extension ClassLoader): 这个加载器加载Java的扩展库,Java平台的扩展功能实现类通常位于jre/lib/ext目录下或者由java.ext.dirs系统属性指定的路径中。
  • 系统(应用)类加载器(System or Application ClassLoader): 这个加载器负责加载用户路径(即classpath指定的所有路径)上的类库,如果没有特别指定,则用户自定义的类加载器通常其这个加载器为父加载器。

示例

让我们来看一下实际代码中类加载器如何工作。假设我们要加载叫做MyClass的类:

public class MyClass {
    static {
        System.out.println("MyClass initialized!");
    }
}

接下来启动Java程序,使用自定义的类加载器加载上面的类:

public class CustomClassLoader extends ClassLoader {
    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {
        // 明确拒绝加载MyClass类,其余的类都委派给父加载器来加载
        if ("MyClass".equals(name)) {
            throw new ClassNotFoundException("Not allowed to load MyClass");
        }
        return super.loadClass(name);
    }
    
    public static void main(String[] args) throws Exception {
        CustomClassLoader loader = new CustomClassLoader();
        Class<?> clazz = loader.loadClass("MyClass");
    }
}

如果按照双亲委托模型,CustomClassLoader会委派其父加载器来加载MyClass,父加载器会向上委派至最顶层,从而保证了类的统一加载。

这是一个简化的例子来解释双亲委托模型,实际的加载细节要比这复杂的多,像findClass方法的使用,加载过程中的安全性检查等都是需要处理的。

双亲委托模型在Java类加载中提供了一定的规则,确保了Java平台的稳定性和安全性。不过,也有一些情况会打破这个模型,例如OSGi就提供了一种不同于双亲委托的类加载方式。在某些复杂应用中,可能会根据需要自定义类加载器,到时候可能需要适当地绕过双亲委托模型。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java奋斗者

听说打赏我的人再也不会有BUG

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值