双亲委派模型

  从Java虚拟机的角度来讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用c++语言实现,是虚拟机自身的一部分;另一种就是所有其他的类加载器,这些加载器都是由Java语言实现,独立与虚拟机外部,并且全部都继承自java.lang.ClassLoader。

  从开发人员角度来看,类加载器还可划分得更细致一些,绝大部分Java程序都会使用到以下3种系统提供的类加载器。启动类加载器,扩展类加载器,应用程序类加载器。我们的应用程序都是由这3种类加载器互相配合进行加载的,如果没有必要,还可以加入自己定义的类加载器。

  

        类加载器双亲模型

  双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。

  双亲委派模型工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。

  优点:Java类随着它的类加载器一起具备了一种带有优先级的层次关系;保证Java程序的稳定运作。

  实现:先检查是否已经被加载过,若没有加载则调用父加载器的loadClass()方法,若父加载器为空则默认使用启动类加载器作为父加载器。如果父类加载失败,抛出ClassNotFoundException异常后,再调用自己的findClass()方法进行加载。

参考文献

《深入理解Java虚拟机》  机械工业出版社  周志明著

 

posted @ 2017-08-11 18:02  chump  阅读(229)  评论(0编辑  收藏  举报