• 双亲委派模型


      什么是双亲委派模型?

    概念:加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被加载,子加载器尝试加载该类。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方法(不依照往上开始寻找类加载器),那就算是打破双亲委派机制了。

    优势:

  • 相关阅读:
    数理统计笔记2:总体均值的抽样分布
    pacemaker常用命令
    操作系统概念 系统调用与 API
    C语言学习笔记
    centos下给es7.12.1设置密码
    【云原生Kubernetes系列第三篇】二进制部署单节点Kubernetes(k8s)v1.20
    MySQL2:MySQL中一条查询SQL是如何执行的?
    如果一个人很想你,却又不敢打扰你,会暴露三个痕迹
    如何用springboot写自定义查询数据库字段以及根据传入字段写增删改查方法
    [Linux]记录plasma-wayland下无法找到HDMI接口显示器的问题解决方案
  • 原文地址:https://blog.csdn.net/m0_73499047/article/details/132921059