✅ Java 双亲委派模型¶
✅ 什么是双亲委派模型?¶
类加载器在加载类时,总是先将请求交给父加载器,只有在父加载器无法加载的情况下,子加载器才会尝试加载。
✅ 双亲委派模型的核心结构:¶
[BootstrapClassLoader]
↑
[ExtClassLoader]
↑
[AppClassLoader]
↑
[自定义ClassLoader(如 Tomcat 的 WebAppClassLoader)]
✅ 双亲委派的两个主要作用:¶
🎯 1. 防止 Java 核心类被篡改(安全性)¶
- 比如你创建了一个
java.lang.String
类,试图替换系统类; - 如果没有双亲委派,用户类加载器可能会优先加载你写的“假 String”;
- 有了双亲委派,请求会先给 BootstrapClassLoader,它会加载真实的
rt.jar
里的 String 类; - ✅ 保证了 Java 核心类不能被用户代码替换,增强 JVM 安全性。
🎯 2. 避免类被重复加载(类唯一性)¶
- JVM 中,一个类只能由某个类加载器加载一次;
- 如果子加载器重复加载相同类,会造成
LinkageError
或内存浪费; - 通过双亲委派,父加载器已加载的类,子加载器直接复用;
- ✅ 确保类全局唯一性,构建统一命名空间。
✅ 总结一句话:¶
双亲委派模型的核心目标是:
- ✅ 保证 Java 核心类不被用户篡改;
- ✅ 保证类不会被重复加载,提升性能与一致性。
📌 拓展(可选):¶
- 可通过自定义类加载器打破双亲委派实现类隔离;
- 比如:Tomcat、Spring Boot 的插件机制。