Java 双亲委派模型(Parent Delegation Model)


一、什么是双亲委派模型?

双亲委派模型是 Java 类加载器(ClassLoader)的一种设计机制: ✅ 避免重复加载
✅ 保证核心类安全、避免被篡改
✅ 提高类加载效率

核心思想:

类加载请求从子加载器逐级向上委托父加载器,只有父加载器加载失败(ClassNotFoundException)后,子加载器才会尝试自己加载。


二、双亲委派的加载流程(核心)

当某个类加载器接收到类加载请求时:

1️⃣ 先检查自己是否加载过(缓存)
2️⃣ 没加载过,委托父加载器加载
3️⃣ 父加载器继续递归往上,直到 Bootstrap ClassLoader
4️⃣ 如果父加载失败(找不到类),再由自己尝试加载

三、类加载器的层次结构(从上往下)

类加载器 加载内容
Bootstrap ClassLoader (启动类加载器) 加载 JVM 核心类(rt.jarjava.*
Extension ClassLoader (扩展类加载器) 加载 ext 目录下的 jar 包
App ClassLoader (应用类加载器) 加载 classpath 下的类
自定义 ClassLoader 加载自己定义的路径或远程资源

四、为什么要设计双亲委派?

✅ 1. 避免类的重复加载:

同一个类,只能被加载一次,优先由父加载器加载,保证唯一性。

✅ 2. 保证安全性:

防止核心类库(java.lang.String)被自定义类覆盖,避免恶意攻击。

✅ 3. 结构清晰,符合“高内聚、低耦合”思想:

下层只管业务类,核心类交给上层加载,职责明确。


五、面试高频问题:破坏双亲委派的场景?

破坏场景

  1. Tomcat、SpringBoot 热部署机制
  2. SPI(Service Provider Interface)机制
  3. 插件式开发(比如 IDE 插件)

✅ 这些场景下会用到 自定义类加载器,选择不走双亲委派,直接加载业务类。


六、经典面试模板回答:

Q:什么是双亲委派机制?为什么需要它?

A:双亲委派模型是 Java 类加载器的核心设计思想。类加载器在加载类时,优先委托父加载器尝试加载,只有父加载器找不到时,子加载器才会自己加载。这样设计可以避免类的重复加载,保证核心类库的安全性,防止被篡改。同时提高了加载效率,符合高内聚低耦合设计原则。

七、总结一句话(面试收尾)

双亲委派本质是“优先父加载,失败自加载”,既保证了类的唯一性和安全性,又支撑了 JVM 模块化和高效运行。

你可能感兴趣的:(java,开发语言,jvm)