什么是双亲委派机制和其作用

本文详细介绍了Java类加载过程中的类加载器类型及其工作原理,包括BootstrapClassLoader、ExtensionClassLoader和AppClassLoader等。同时深入探讨了双亲委派机制的作用及其实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是类加载

  通过javac将.java文件编译成.class字节码文件后,则需要将.class加载到JVM中运行,哪么是谁将.class加载到JVM的呢?那就是类加载器啦。

2.类加载器类型

  • Bootstrap ClassLoader(启动类加载器):该类加载器由C++实现的。负责加载Java基础类,对应加载的文件是%JRE_HOME/lib/ 目录下的rt.jar、resources.jar、charsets.jar和class等。
  • Extension ClassLoader(标准扩展类加载器):继承URLClassLoader。对应加载的文件是%JRE_HOME/lib/ext 目录下的jar和class等。
  • App ClassLoader(系统类加载器):继承URLClassLoader。对应加载的应用程序classpath目录下的所有jar和class等。
  • CustomClassLoader(用户自定义类加载器):由Java实现。我们可以自定义类加载器,并可以加载指定路径下的class文件。

3.什么是双亲委派机制

  双亲委派机制是当类加载器需要加载某一个.class字节码文件时,则首先会把这个任务委托给他的上级类加载器,递归这个操作,如果上级没有加载该.class文件,自己才会去加载这个.class。

4.为什么叫双亲委派机制

  双:代表是两两的意思。亲:代表两者之间有着千丝万缕的关系。委派:则是我们个人办不到的事情,委托别人去帮我们完成。总体来说,就是当子类加载器无法完成这件事时,则会委托父加载器去完成,当父加载器说这不是我做的事情时,则该任务又会落回到子类加载器,此时,子类加载器只能自己去完成该事情。通过上面的阐述,我们则可以明白为什么叫双亲委派机制了,两两之间相互委托对方。(以上纯属个人理解,如有错误之处,请指出)

5.双亲委派的作用

  ①防止加载同一个.class。通过委托去询问上级是否已经加载过该.class,如果加载过了,则不需要重新加载。保证了数据安全。

  ②保证核心.class不被篡改。通过委托的方式,保证核心.class不被篡改,即使被篡改也不会被加载,即使被加载也不会是同一个class对象,因为不同的加载器加载同一个.class也不是同一个Class对象。这样则保证了Class的执行安全。

转载自:https://www.cnblogs.com/enroute/p/13865807.html

### Java类加载器双亲委派机制原理 双亲委派机制是一种设计模式,在Java中主要用于类加载器体系的设计。其基本工作流程是:当某个类加载器收到类加载请求时,它不会立即尝试自行加载该类,而是先将此请求委托给它的父类加载器去完成。只有当父类加载器无法找到或加载所需的类时,当前类加载器才会尝试自己加载[^1]。 具体来说,这种机制通过一种树形结构来组织类加载器之间的关系,其中每个子类加载器都有一个唯一的父类加载器。Bootstrap ClassLoader 是最顶层的类加载器,由 C++ 实现,因此在 Java 中不可见;Extension ClassLoader Application ClassLoader 则分别作为第二层第三层的类加载器[^3]。 #### 工作流程 以下是双亲委派机制的工作流程描述: - 当 `Application ClassLoader` 收到加载某类的请求时,会首先将其传递给 `Extension ClassLoader`。 - 如果 `Extension ClassLoader` 也无法满足需求,则继续向上级传递至 `Bootstrap ClassLoader`。 - 若所有上级均未成功加载目标类,则最终回退至最初发起请求的那个类加载器(即 `Application ClassLoader` 或其他自定义类加载器)进行加载操作[^2]。 ### 双亲委派机制作用 双亲委派机制的主要作用在于保障系统的安全性与一致性: 1. **防止重复加载同一份代码** 同一名称的类只会被同一个类加载路径下的最高权限加载器加载一次,从而避免了不同版本间的冲突问题。例如,标准库中的核心 API 不会被应用级别的类覆盖掉[^3]。 2. **增强系统稳定性** 核心功能模块如 JDK 自带的基础类均由更高级别的加载器管理并提供服务,减少了低级别错误影响整个运行环境的可能性[^1]。 3. **简化依赖解析逻辑** 开发者无需关心复杂的跨层次间相互引用情况,因为任何公共基础组件都已预先设定好优先查找顺序[^4]。 ```java // 示例代码展示如何创建一个简单的自定义类加载器以观察双亲委派行为 public class CustomClassLoader extends ClassLoader { @Override protected Class<?> findClass(String name) throws ClassNotFoundException { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); // 定义新类对象 } private byte[] loadClassData(String className){ try{ String path = "/"+className.replace('.','/')+".class"; InputStream is = getClass().getResourceAsStream(path); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); int data; while((data=is.read())!=-1){ buffer.write(data); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值