/**
* 每天一个知识点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方法
*
*/
网友评论