双亲委派机制(小白易懂)

一、先搞懂:双亲委派到底是什么?

核心定义:双亲委派是JVM类加载器的工作规则------当一个类加载器要加载类时,先把请求委托给「父类加载器」,父类加载不了,自己才动手加载。

⚠️ 注意:这里的「双亲」不是父母,是父类加载器,是层级关系,不是继承关系!

核心目的:2个核心,全是为了安全+高效

  1. 防篡改:保证Java核心类(如java.lang.String)不被恶意替换;

  2. 防重复:避免同一个类被多个加载器重复加载,保证类的唯一性。

二、类加载器的层级(4层,从上到下权限越来越小)

先明确JVM的类加载器层级,双亲委派就是按这个层级委托,从上到下依次是:

  1. 启动类加载器(最顶层,C++实现):加载JVM核心类库(rt.jar),比如java.lang.StringSystem,无法被Java程序访问;

  2. 扩展类加载器:加载JRE扩展目录(jre/lib/ext)的类,补充核心类之外的扩展功能;

  3. 应用程序类加载器(系统类加载器):最常用!加载你自己写的代码+第三方依赖(maven引入的jar包);

  4. 自定义类加载器:开发者自定义(继承ClassLoader),加载非标准路径的类(如加密字节码)。

层级关系:应用程序加载器 → 扩展类加载器 → 启动类加载器(子→父)

三、双亲委派的工作流程(3步,通俗类比+核心逻辑)

用「找领导审批」类比,一看就懂:

  1. 子类加载器收到加载请求(你要加载自己写的Student类),先不自己干,找父类加载器(应用类加载器找扩展类加载器);

  2. 父类加载器收到请求,继续往上委托,直到顶层(扩展类加载器找启动类加载器);

  3. 从顶层往下检查:启动类加载器看自己能不能加载(只加载核心类,不行)→ 扩展类加载器看自己能不能加载(不行)→ 回到应用类加载器,自己动手加载Student类。

✅ 一句话总结流程:先向上委托,再向下尝试加载,父类能加载的,子类绝不插手!

四、核心价值:为什么要有双亲委派?(面试必答)

用「防篡改核心类」举例,最直观:

假设你恶意写了一个类 java.lang.String(想替换Java自带的String,搞破坏):

  1. 应用类加载器收到加载请求,先委托给扩展类加载器,再委托给启动类加载器;

  2. 启动类加载器发现,java.lang.String是自己负责的核心类,直接加载JDK自带的版本;

  3. 自带的已经加载,就不会加载你写的恶意类,避免核心类被篡改,保证程序安全!

除此之外,还能避免重复加载:同一个类只会被一个加载器加载,保证内存中类的唯一性。

五、面试高频考点(直接背,不踩坑)

考点1:双亲委派的工作流程?

答:子类加载器收到请求,先向上委托给父类加载器,从顶层启动类加载器开始尝试加载,父类加载不了,子类才自己加载(先委托,后自加载)。

考点2:双亲委派的好处?

答:① 安全:防止核心类(如String)被恶意篡改;② 高效:避免类重复加载,保证类唯一性。

考点3:哪些场景会打破双亲委派?

答:① 热部署(如Tomcat):需要子类加载器优先加载类;② 反射/动态代理;③ 自定义类加载器重写loadClass方法。

考点4:为什么启动类加载器获取不到(输出null)?

答:启动类加载器由C++实现,不是Java类,不属于Java体系,所以Java程序无法获取到引用,输出null。

七、小白总结(3句话记牢)

  1. 双亲委派是类加载器的工作规则:先向上委托,再向下加载,父类优先;

  2. 核心目的是防篡改、防重复,保护Java核心类安全;

  3. 核心类由启动类加载器加载,自己写的类由应用程序类加载器加载,层级清晰。

(注:文档部分内容由 AI 生成)

相关推荐
vx_Biye_Design2 小时前
【关注可免费领取源码】云计算及其应用网络教学系统--毕设附源码35183
java·spring·spring cloud·servlet·eclipse·云计算·课程设计
码农阿豪8 小时前
Nacos 日志与 Raft 数据清理指南:如何安全释放磁盘空间
java·安全·nacos
直有两条腿9 小时前
【大模型】Langchain4j
java·langchain
love530love9 小时前
Scoop 完整迁移指南:从 C 盘到 D 盘的无缝切换
java·服务器·前端·人工智能·windows·scoop
消失的旧时光-19439 小时前
C++ 多线程与并发系统取向(二)—— 资源保护:std::mutex 与 RAII(类比 Java synchronized)
java·开发语言·c++·并发
莫寒清9 小时前
ThreadLocal
java·面试
学习是生活的调味剂10 小时前
spring bean循环依赖问题分析
java·后端·spring
Coder_Boy_11 小时前
Java(Spring AI)传统项目智能化改造——商业化真实案例(含完整核心代码+落地指南)
java·人工智能·spring boot·spring·微服务
五阿哥永琪11 小时前
1. 为什么java不能用is开头来做布尔值的参数名,会出现反序列化异常。
java·开发语言
chilavert31812 小时前
技术演进中的开发沉思-371:final 关键字(中)
java·前端·数据库