73.双亲委派模型

2020-08-09  本文已影响0人  SlideException
/**
 * 每天一个知识点day73 TODO 双亲委派模型
 *
 * 自定义类加载器 ->
 *                 应用程序类加载器 -> 扩展类加载器 -> 启动类加载器
 * 自定义类加载器 ->
 *
 * 启动类加载器(Bootstrap ClassLoader):
 * 由C++语言实现(针对HotSpot),负责将存放在<JAVA_HOME>\lib目录或
 * -X bootclasspath参数指定的路径中的类库加载到内存中。
 *
 * 扩展类加载器(Extension ClassLoader):
 * 负责加载<JAVA_HOME>\lib\ext目录或java.ext.dirs系统变量指定的路径中的所有类库。
 *
 * 应用程序类加载器(Application ClassLoader):
 * 负责加载用户类路径(classpath)上的指定类库,我们可以直接使用这个类加载器。
 * 一般情况,如果我们没有自定义类加载器默认就是用这个加载器。
 *
 * 双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器,
 * 不过这里的类加载器之间的父子关系并不是通常所说的继承关系,而是通常使用组合关系
 * 来复用父类加载器的代码。
 *
 * 双亲委派模型在JDK1.2时期被引入,工作过程:
 * 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个
 * 请求委派给父类加载器去完成,如果父类加载器还存在父类加载器,则进一步向上委托,
 * 依次递归,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,如果父类
 * 加载器可以完成类加载任务,就成功返回,只有当父加载器反馈自己无法完成这个加载
 * 请求(它搜索范围中没有找到所需的类)时,子类加载器才会尝试自己去完成加载。
 *
 * 优势:
 * 1.采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有
 * 优先级的层次关系,通过这种层级关可以避免类的重复加载,
 * 当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。
 *
 * 2.其次是考虑到安全因素,java核心api中定义类型不会被随意替换,
 * 假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到
 * 启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,
 * 并不会重新加载网络传递的过来的java.lang.Integer,
 * 而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。
 *
 * 注意的是在JDK1.2之前,类加载尚未引入双亲委派模式,因此实现自定义类加载
 * 器时常常重写loadClass方法,提供双亲委派逻辑,从JDK1.2之后,
 * 双亲委派模式已经被引入到类加载体系中,自定义类加载器时不需要在自己写双亲委派的逻辑,
 * 因此不鼓励重写loadClass方法,而推荐重写findClass方法
 *
 */
上一篇下一篇

猜你喜欢

热点阅读