这个名字其实是从英文 Parent Delegation Model(直译为“父亲委托模型”)来的。
中文通常翻译成“双亲委派机制”或“父类委托机制”,但“双亲委派”更常见。
一、为什么叫“双亲委派”?
-
“双亲”指什么?
- 在 Java 的类加载器体系中,每个 ClassLoader(类加载器)都有一个“父”ClassLoader。
- 这种关系是链式的:Application ClassLoader → Extension ClassLoader → Bootstrap ClassLoader。
- 由于“父”ClassLoader 可能还有自己的“父”,所以叫“双亲”而不是“父亲”,强调的是层层递归的委派关系。
-
“委派”是什么意思?
- 当前 ClassLoader 在加载类时,不是自己先动手,而是委托给“父”ClassLoader 先尝试加载。
- 如果父 ClassLoader 能加载,就直接用父的结果;只有父加载不了,当前 ClassLoader 才自己动手。
-
“双亲委派”表达的核心思想
- 你的加载请求会一层一层往上递交,直到最顶层(Bootstrap ClassLoader)。
- 只有所有“父”都加载失败,当前 ClassLoader 才会尝试自己加载。
-
举个通俗的例子
想象你在公司找某份文档:
- 你(Application ClassLoader)先问你的直属上司(Extension ClassLoader),
- 上司找不到,继续问总经理(Bootstrap ClassLoader),
- 总经理找不到,最后才轮到你自己找。
这种“层层请求、逐级委派”的方式,就是“双亲委派”。
二、为什么需要双亲委派?
1. 防止类重复加载和冲突
如果没有双亲委派,每个类加载器都可以加载同名类,这样 JVM 里可能出现多个版本的同名类,导致类型不兼容、方法找不到等问题。双亲委派机制保证了同一个类只被一个类加载器加载一次,避免了冲突。
2. 保证 Java 核心类的安全性
假设你可以用自己的类加载器加载一个叫 java.lang.String 的类,这会导致核心类被篡改,影响 JVM 的稳定性和安全性。双亲委派机制确保只有最顶层的 Bootstrap ClassLoader 能加载 Java 标准库类,应用层无法覆盖和替换这些类,防止安全漏洞。
3. 层次结构清晰,便于管理
双亲委派机制形成了类加载器的层次结构,每个类加载器只负责自己的职责范围,委托父加载器处理更高层的类加载任务。这种结构让类的查找和加载变得有序、易于管理。
4. 提升性能
通过委派机制,可以避免重复的类查找和加载操作,提高了 JVM 的运行效率。
三、双亲委派带来的好处
1. 安全性
- 防止恶意代码覆盖核心类库。
- 保证底层和上层类库的隔离。
2. 一致性
- 同一个类在 JVM 中只会被加载一次,类型一致,避免“类冲突”问题。
3. 可扩展性
- 支持自定义 ClassLoader(比如插件加载、热更新等),但仍然通过双亲委派保证整体安全。
4. 易维护性
- 层次分明,每个类加载器只负责自己的部分,定位和解决问题更容易。
四、总结
双亲委派机制:
- 是 JVM 类加载器体系中非常重要的设计;
- 保证了安全、稳定、一致;
- 防止了重复加载和核心类被篡改。
如果没有双亲委派机制,Java 的类加载体系就会变得混乱且不安全,这就是它设计的初衷和带来的主要好处!
如需举例或者更深入探讨某个细节,欢迎继续提问!

541

被折叠的 条评论
为什么被折叠?



