双亲委派机制(Parent Delegation Model)是 Java 类加载器(ClassLoader) 的核心工作机制,它定义了类加载器在加载类时的协作规则。它的核心思想是:先让父类加载器尝试加载类,父类无法完成时,子类加载器才自己加载。
1. 双亲委派机制的工作流程
-
委派规则
当一个类加载器收到加载类的请求时:- 先检查是否已被加载,若已加载则直接返回。
- 不立即尝试加载,而是将请求委派给父类加载器(递归向上)。
- 若父类加载器无法加载(在自己的搜索范围内找不到类),子类加载器才会尝试加载。
// 类加载器的 loadClass 方法简化逻辑 protected Class<?> loadClass(String name, boolean resolve) { // 1. 检查是否已加载 Class<?> c = findLoadedClass(name); if (c == null) { try { // 2. 递归委派给父类加载器 if (parent != null) { c = parent.loadClass(name, false); } else { // 父类为 null 时,使用启动类加载器(Bootstrap ClassLoader) c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) {} if (c == null) { // 3. 父类无法加载时,自己尝试加载 c = findClass(name); } } return c; }
-
类加载器的层次关系
Java 默认类加载器层级(自顶向下):- Bootstrap ClassLoader(启动类加载器):加载
JRE/lib
下的核心类库(如rt.jar
)。 - Extension ClassLoader(扩展类加载器):加载
JRE/lib/ext
下的扩展类。 - Application ClassLoader(应用类加载器):加载用户类路径(ClassPath)下的类。
- 自定义 ClassLoader(用户子类加载器):可扩展实现
- Bootstrap ClassLoader(启动类加载器):加载