随笔录--双亲委派模式

本文详细介绍了Java类加载器中的双亲委派模式,包括其工作原理、如何避免重复加载、保护核心类库安全以及在特定场景下的调整。强调了双亲委派模式在确保类加载过程稳定性、安全性和可维护性方面的重要性。
摘要由CSDN通过智能技术生成

官方解析

双亲委派模式(Parent-Delegate Model)是 Java 类加载器(ClassLoader)在加载类时所采用的一种设计模式。这种模式的核心思想是:当一个类加载器收到类加载请求时,首先不会尝试自己加载这个类,而是将请求委派给其父类加载器。依次递归,直到最顶层的启动类加载器(Bootstrap ClassLoader);如果父类加载器无法加载该类,子类加载器才尝试自己去加载

双亲委派模式的作用主要有以下几点:

  1. 避免类的重复加载:通过委派给父类加载器加载类,可以确保同一个类不会被多个类加载器重复加载。这有助于节省内存资源,并确保类之间的互操作性。

  2. 保护 Java 核心类库:由于双亲委派模式的存在,用户自定义的类加载器无法直接加载 Java 核心类库(如java.lang.Object等)。这有助于确保 Java 核心类库的安全性,防止恶意代码篡改或破坏Java核心类。

  3. 维护类加载器的层次结构:双亲委派模式使得各级类加载器可以按照一定的层次结构来组织和管理。这有助于降低类加载器的复杂性,简化类加载过程。

双亲委派模式在 Java 类加载器中的应用是一种优秀的设计原则,它有助于确保类加载过程的稳定性、安全性和可维护性。

然而,在某些特殊场景下(如 OSGi、Java 热加载等),双亲委派模式可能无法满足需求,需要采用其他类加载策略。在这些场景下,开发者需要充分了解类加载机制,以避免产生意外的问题。

 

双亲委派模式是一种类加载机制,它是基于一个简单的原则:除非有明确的需求,否则类加载器不会尝试去加载一个它找不到的类,而是把这个任务交给父类加载器来完成。

具体来说,当一个类加载器需要加载某个类时,它首先会委派给它的父类加载器去加载该类。如果父类加载器无法找到该类,则再将加载任务委派给它的父类加载器,直到最终委派到顶层的启动类加载器。如果顶层的启动类加载器仍然无法找到该类,则会抛出 ClassNotFoundException 异常。

这样做的好处是:防止内存中出现多份同样的字节码。

双亲委派模式的作用:

  • 保证 JVM 中每个类只会被加载一次,避免重复加载。当一个类被加载后,它会被缓存在 JVM 的内存中,以便之后的使用。

  • 如果不采用双亲委派模式,可能会导致同一个类被多次加载,从而浪费大量的内存资源。

  • 此外,双亲委派模式还可以保证类的安全性,因为如果一个类是由用户自定义的类加载器加载的,那么它并不能访问由系统类加载器或其它更高级别的类加载器加载的类。对于一些核心类,例如 java.lang.Object、java.lang.String 等,它们都是由启动类加载器加载的,因此也可以保证它们的正确性和安全性。

图片

双亲委派机制是指当一个类加载器收到一个类加载请求时,该类加载器首先会把请求委派给父类加载器。每个类加载器都是如此,只有在父类加载器在自己的搜索范围内找不到指定类时,子类加载器才会尝试自己去加载。

双亲委派模型的好处 双亲委派模型保证了 Java 程序的稳定运行,可以避免类的重复加载,因为即使这两个类来源于同一个 Class 文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那么这两个类就必定不相等。

同时保证了 Java 的核心 API 不被篡改。避免类的重复加载 保证Java核心API不被篡改

双亲委派:

图片

类加载机制:双亲委派模型顾名思义就是每一个类加载器(classLoader)收到一个类加载请求,都不会先自己去加载,而是委托给自己的父类加载,如果父类加载器还存在它的父类加载器,则继续向上委托,直到达到最顶层的父类加载器,从最顶层的父类加载器开始进行类的加载,如果最顶层的类加载器找不到类的路径,又交给子类加载进行加载,依次进行递归,通俗地说,如下面的例子:

  • 假设用户刚刚写的 Tes t类想进行加载,这个时候首先会发送给应用程序类加载器 AppCloassLoader;

  • 然后 AppClassLoader 并不会直接去加载 Test 类,而是会委派于父类加载器完成此操作,也就是 ExtClassLoader;

  • ExtClassLoader 同样也不会直接去加载 Test 类,而是会继续委派于父类加载器完成,也就是 BootstrapClassLoader;

  • BootstrapClassLoader 这个时候已经到顶层了,没有父类加载器了,所以 BootstrapClassLoader 会在 jdk/lib 目录下去搜索是否存在,因为这里是用户自己写的 Test 类,是不会存在于 jdk 下的,所以这个时候会给子类加载器一个反馈。

  • ExtClassLoader 收到父类加载器发送的反馈,知道了父类加载器并没有找到对应的类,爸爸靠不住,就只能自己来加载了,结果显而易见,自己也不行,没办法,只能给更下面的子类加载器了。

  • AppClassLoader 收到父类加载器的反馈,顿时明白,原来爸爸虽然是爸爸,但是他终究不能管儿子的私事,所以这时候,AppClassLoader 就自己尝试去加载。

作用:

  1. 避免重复加载类:如果一个类已经被某个类加载器加载过了,那么其他类加载器就不需要再次加载该类,因为类的定义只需要加载一次就可以了。

  2. 确保类的唯一性:通过双亲委派模式,可以保证不同的类加载器加载同一个类时,得到的都是同一个 Class 对象,从而保证了类的唯一性。

  3. 安全性:通过双亲委派模式,可以保证核心 Java API 不会被非法替换,从而提高了 Java 应用的安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值