双亲委派模型(Parents Delegation Model)(JDK 8)
类加载器的双亲委派模型在 JDK 1.2 时期被引入并被广泛应用于此后几乎所有的 Java 程序中但它并不是一个具有强制性的约束力的模型而是 Java 设计者们推荐给开发者的一种加载器实现的最佳实践。一、类加载器Java 虚拟机设计团队有意把类加载阶段中的 “ 通过一个类的全限定名来获取描述该类的二进制字节流 ” 这个动作放到 Java 虚拟机外部去实现以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为 “ 类加载器 ”Class Loader。判断两个类的是否 “ 相等 ”是由类和加载类的类加载器共同决定的。这里包括 Class 对象的 equal()isAssignableFrom()isInstance()和 instanceof 关键字的判断。二、双亲委派模型2.1、双亲委派模型的建立从虚拟机的角度只有两种类加载器一种启动类加载器Bootstrap ClassLoader使用 C实现是虚拟机的一部分另一种是继承自抽象类java.lang.ClassLoader的启动器。但是在虚拟机实际中提供了三种类加载器启动类加载器Bootstrap Class Loader主要负责加载存放在JAVA_HOME\lib目录下或者被-Xbootclasspath参数指定的路径中存放的Java虚拟机能识别的类名如rt.jar、tools.jar等的类。加载请求委派给引导类加载器时使用null的。扩展类加载器Extension Class Loader主要负责加载JAVA_HOME\lib\ext目录下或者被java.ext.dirs系统变量所指定的路径中的所有类。sun.misc.Launcher.ExtClassLoader应用程序类加载器Application Class Loader复杂加载用户类路径Classpath上所有的类库开发者可以直接在代码中使用这个类加载器java.lang.ClassLoader#getSystemClassLoader。一般情况下系统默认的类加载器也称 “ 系统类加载器 ”。sun.misc.Launcher.AppClassLoader在虚拟机内部加载器之间存在一定的关系如下而这种层级关系是JDK 1.2以来虚拟机设计者为开发者提供的类加载器最佳实践模型。这种类似父子关系的层级模型称为 “双亲委派模型Parents Delegation Model”。这种父子关系并不是依赖于继承而是使用的组合。双亲委派模型的工作过程如下当前类加载器首先从自己已经加载的类缓存中查询是否此类已经加载如果已经加载则直接返回原来已经加载的类。如果在当前类加载器的缓存中没有找到期待被加载的类时则委托父类加载器去加载。父类加载器采用同样的策略首先查看自己的缓存如果仍然没有则继续委托其父类加载去加载一直到 BootStrapClassLoader启动类加载器。