• 双亲委派模型


      什么是双亲委派模型?

    概念:加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被加载,子加载器尝试加载该类。JDK 中的本地方法类一般由根加载器(Bootstrp loader)装载,JDK 中内部实现的扩展类一般由扩展加载器(ExtClassLoader )实现装载,而程序中的类文件则由系统加载器(AppClassLoader )实现装载。

    源码分析:

    1. protected Class loadClass(String name, boolean resolve)
    2. throws ClassNotFoundException
    3. {
    4. synchronized (getClassLoadingLock(name)) {
    5. // 首先检查这个classsh是否已经加载过了
    6. Class c = findLoadedClass(name);
    7. if (c == null) {
    8. long t0 = System.nanoTime();
    9. try {
    10. // c==null表示没有加载,如果有父类的加载器则让父类加载器加载
    11. if (parent != null) {
    12. c = parent.loadClass(name, false);
    13. } else {
    14. //如果父类的加载器为空 则说明递归到bootStrapClassloader了
    15. //bootStrapClassloader比较特殊无法通过get获取
    16. c = findBootstrapClassOrNull(name);
    17. }
    18. } catch (ClassNotFoundException e) {}
    19. if (c == null) {
    20. //如果bootstrapClassLoader 仍然没有加载过,则递归回来,尝试自己去加载class
    21. long t1 = System.nanoTime();
    22. c = findClass(name);
    23. sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
    24. sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
    25. sun.misc.PerfCounter.getFindClasses().increment();
    26. }
    27. }
    28. if (resolve) {
    29. resolveClass(c);
    30. }
    31. return c;
    32. }
    33. }

    为什么使用双亲委派模型?

    因为这样可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。

     如何打破双亲委派机制?

    只要我加载类的时候,不是从APPClassLoader->Ext ClassLoader->BootStrap ClassLoader 这个顺序找,那就算是打破了。

    因为加载class核心的方法在LoaderClass类的loadClass方法上(双亲委派机制的核心实现)。

    那只要我自定义个ClassLoader,重写loadClass方法(不依照往上开始寻找类加载器),那就算是打破双亲委派机制了。

    优势:

  • 相关阅读:
    系统架构设计】计算机公共基础知识: 5 数学与经济管理
    js filter,every,includes 过滤数组
    axios的安装使用
    尚硅谷-JVM-内存和垃圾回收篇(P1~P203)
    怎么在PDF上画圈做标注?标注方法其实很简单
    Codeforces Round 932 (Div. 2) --- C. Messenger in MAC --- 题解
    在 Electron上安装better-sqlite3出错
    Java网页版即时通讯聊天系统(附源码)
    组合式API_模板引用
    springboot-异步、定时、邮件任务
  • 原文地址:https://blog.csdn.net/m0_73499047/article/details/132921059