#埃尔法哥哥#类加载机制与双亲委派( 二 )


扩展类加载器ExtensionClassLoader 。 该加载器主要是负责加载libext , 该加载器可以被开发者直接使用
应用程序类加载器ApplicationClassLoader 。 该类加载器也称为系统类加载器 , 它负责加载用户类路径CLASS_PATH上所指定的类库 , 开发者可以直接使用该类加载器 , 如果应用程序中没有自定义过自己的类加载器 , 一般情况下这个就是程序中默认的类加载器
下图展示了类加载器之间的这种层次关系 。 这种模型被称为类加载器的双亲委派模型
#埃尔法哥哥#类加载机制与双亲委派
文章图片
双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求 , 它首先不会自己去尝试加载这个类 , 而是把这个请求委派给父类加载器去完成 , 每一个层次的类加载器都是如此 , 因此所有的加载请求都最终应该传送到顶层的启动类加载器中 , 只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时 , 子类加载器才会尝试自己去加载 。
为什么这么设计?
【#埃尔法哥哥#类加载机制与双亲委派】使用双亲委派模型来组织类加载器之间的关系 , 有一个显而易见的好处就是Java类随着它的类加载器一起具备了一种带有优先级的层次关系 。 例如类java.lang.Object , 它存放在rt.jar之中 , 无论哪一个类加载器要加载这个类 , 最终都是委派给处于模型最顶端的启动类加载器进行加载 , 因此Object类在程序的各种类加载器环境中都是同一个类 。 相反 , 如果没有使用双亲委派模型 , 由各个类自行去加载的话 , 如果用户自己编写了一个java.lang.Object的类 , 并放在程序的CLASS_PATH中 , 那系统中将会出现多个不同的Object类 , Java体系同最基础的行为也就无法保证 , 应用程序也会变得一片混乱 。