• 类加载机制:全盘负责和双亲委托


    “全盘负责”是指当一个ClassLoader装载一个类时,除非显示地使用另一个ClassLoader,则该类所依赖及引用的类也由这个CladdLoader载入。

    例如,系统类加载器AppClassLoader加载入口类(含有main方法的类)时,会把main方法所依赖的类及引用的类也载入,依此类推。“全盘负责”机制也可称为当前类加载器负责机制。显然,入口类所依赖的类及引用的类的当前类加载器就是入口类的类加载器。

    以上步骤只是调用了ClassLoader.loadClass(name)方法,并没有真正定义类。真正加载class字节码文件生成Class对象由“双亲委派”机制完成。

    “双亲委派”是指子类加载器如果没有加载过该目标类,就先委托父类加载器加载该目标类,只有在父类加载器找不到字节码文件的情况下才从自己的类路径中查找并装载目标类。

    “双亲委派”机制加载Class的具体过程是:

    1. 源ClassLoader先判断该Class是否已加载,如果已加载,则返回Class对象;如果没有则委托给父类加载器。
    2. 父类加载器判断是否加载过该Class,如果已加载,则返回Class对象;如果没有则委托给祖父类加载器。
    3. 依此类推,直到始祖类加载器(引用类加载器)。
    4. 始祖类加载器判断是否加载过该Class,如果已加载,则返回Class对象;如果没有则尝试从其对应的类路径下寻找class字节码文件并载入。如果载入成功,则返回Class对象;如果载入失败,则委托给始祖类加载器的子类加载器。
    5. 始祖类加载器的子类加载器尝试从其对应的类路径下寻找class字节码文件并载入。如果载入成功,则返回Class对象;如果载入失败,则委托给始祖类加载器的孙类加载器。
    6. 依此类推,直到源ClassLoader。
    7. 源ClassLoader尝试从其对应的类路径下寻找class字节码文件并载入。如果载入成功,则返回Class对象;如果载入失败,源ClassLoader不会再委托其子类加载器,而是抛出异常。

    “双亲委派”机制只是Java推荐的机制,并不是强制的机制。

    我们可以继承java.lang.ClassLoader类,实现自己的类加载器。如果想保持双亲委派模型,就应该重写findClass(name)方法;如果想破坏双亲委派模型,可以重写loadClass(name)方法

  • 相关阅读:
    20165220《网络对抗技术》week1 Exp0 Kali安装
    2018-2019-1 20165220 实验五 通讯协议设计
    20165220 《信息安全系统设计基础》第9周学习总结
    20165204 20165216 20165220 实验四 外设驱动程序设计
    20165220 mybash
    2018-2019-1 20165220 《信息安全系统设计基础》第八周学习总结
    20165220 实验三《并发程序》
    2018-2019-1 20165220 《信息安全系统设计基础》第7周学习总结
    2018-2019-1 20165220 《信息安全系统设计基础》第6周学习总结
    实验二 固件程序设计
  • 原文地址:https://www.cnblogs.com/KingIceMou/p/6796678.html
Copyright © 2020-2023  润新知