类加载器的双亲委派模型
一个类加载器收到了类加载的请求,它该如何去加载这个类呢?
双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己尝试去加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传递到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。
双亲委派模型对于保证Java
程序的稳定性运作很重要。使用双亲委派模型来组织类加载器之间的关系,有一个显而易见的好处就是Java
类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object
,它存放在rt.java
之中,无论哪个类加载器要加载这个类,最终都是委派给启动类加载器进行加载,因此Object
类在程序的各种类加载器环境中都是同一个类。相反,如果没有使用双亲委派模型,由各个类加载器自行加载的话,如果用户自己写了一个名为java.lang.Object
的类,并放在程序的ClassPath
中,那系统中将会出现多个不同的Object
类,Java
类型体系中最基础的行为也就无从保证,应用程序也将会变得一片混乱。
综上,双亲委派模型的优点如下:
- 避免重复加载,当父类加载器已经加载过该类时,子类加载器没必要再重复加载
- 安全性考虑,防止核心
API
库被随意篡改
附:子加载器和父类加载器是继承关系吗?