双亲委派模型
双亲委派模型(Parent Delegation Model)是 Java 类加载机制中的一个核心概念,它用于组织和管理 Java 类加载器的工作方式。在Java中,类加载器负责将 .class
文件加载到内存中,并通过双亲委派模型来保证类的加载过程具有一定的安全性和统一性。
这一模型的核心思想是:类加载器在接收到类加载请求时,首先不会自己尝试加载该类,而是将这个请求委派给它的父类加载器去处理。只有当父类加载器无法加载该类时,当前类加载器才会尝试自己去加载。
根据官方的说明:
ClassLoader
类使用委托模型来搜索类和资源。每个 ClassLoader
实例都有一个相关的父类加载器。需要查找类或资源时,ClassLoader
实例会在试图亲自查找类或资源之前,将搜索类或资源的任务委托给其父类加载器。
虚拟机中被称为 “bootstrap class loader
” 的内置类加载器本身没有父类加载器,但是可以作为 ClassLoader
实例的父类加载器。
这里的双亲更多地表达的是“父母这一辈”的人,并不是说真的有一个 MotherClassLoader
和一个 FatherClassLoader
。
另外,类加载器之间的父子关系一般不是以继承的关系来实现的,而是通常使用组合关系来复用父加载器的代码。在面向对象编程中,有一条非常经典的设计原则:组合优于继承,多用组合少用继承。
public abstract class ClassLoader {
...
// 组合
private final ClassLoader parent;
protected ClassLoader(ClassLoader parent) {
this(checkCreateClassLoader(), parent);
}
...
}
执行流程
双亲委派模型的实现代码的逻辑非常清晰,都集中在 java.lang.ClassLoader
的 loadClass()
中,以下是 loadClass()
的源代码: