双亲委派机制是类加载时“先委托父加载器,失败后再自行加载”的责任链模式。启动类加载器加载rt.jar核心类,扩展类加载器加载ext目录,应用类加载器加载用户类,三者通过组合而非继承关联,确保类的唯一性与安全性。

双亲委派机制不是“爸爸+妈妈”一起管,而是“先找长辈,长辈不行再自己来”的责任传递规则。
它像公司里的问题上报流程
你(应用类加载器)写了个 A.class,JVM 要用它时,你不急着自己加载,而是先报告给直属领导(扩展类加载器);领导也懒得干,转头报给他的领导(启动类加载器);顶层领导翻遍核心库(rt.jar等),发现没有 A.class,就回话:“这活我不管。”——这时才轮到你动手,在自己的 classpath 里找到并加载它。
三个关键加载器各司其职
-
启动类加载器:C++ 写的“老祖宗”,只认
JRE/lib/rt.jar里的核心类(如Object、String),Java 代码拿不到它(调用getClass().getClassLoader()得到null) -
扩展类加载器:管
JRE/lib/ext下的扩展包,父加载器是启动类加载器 - 应用类加载器:我们写的代码、Maven 引入的 jar,都归它管,父加载器是扩展类加载器
为什么非要这么绕?两个硬需求
-
防篡改:你自己写个
java.lang.String,想替换系统 String?不行。启动类加载器早把正版加载进内存了,你的类根本没机会被加载——因为请求一上来就被它“截胡”了 -
保唯一:同一个类名(如
com.example.User)不会被不同加载器重复加载两次,避免运行时出现ClassCastException或静态块多次执行
它不是继承,是组合
别被“父”“子”误导——三个加载器之间没有 extends 关系。应用类加载器内部持有一个 parent 字段,指向扩展类加载器;扩展类加载器的 parent 指向启动类加载器(实际为 null,代表由 JVM 底层处理)。这种“持有关系”叫组合,更灵活,也更符合设计初衷。











