通俗易懂的双亲委派机制

通俗易懂的双亲委派机制你得先知道在介绍双亲委派机制的时候,不得不提ClassLoader。说ClassLoader之前,我们得先了解下Java的基本知识。Java是运行在Java的虚拟机(JVM)中的,但是它是怎么就运行在JVM中了呢?我们在IDE中编写的Java源代码被编译器编译成.class的字节码文件。然后由我们得ClassLoader负责将这些class问价加载到JVM中去执行。JVM中…

大家好,又见面了,我是你们的朋友全栈君。

当你超过别人一点点,别人会嫉妒你;当你超过别人一大截,别人就会羡慕你

据说给我点关注的都成了大佬,点关注的我都会私发一份好东西​​​​​​​

呕心沥血半年之作,进去不点赞你回来骂我icon-default.png?t=M1L8https://blog.csdn.net/codeyanbao/article/details/111569150​​​​​​​

你得先知道

在介绍双亲委派机制的时候,不得不提ClassLoader(类加载器)。说ClassLoader之前,我们得先了解下Java的基本知识。  
  Java是运行在Java的虚拟机(JVM)中的,但是它是如何运行在JVM中了呢?我们在IDE中编写的Java源代码被编译器编译成.class的字节码文件。然后由我们得ClassLoader负责将这些class文件给加载到JVM中去执行。  
  JVM中提供了三层的ClassLoader:

  • Bootstrap classLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。

  • ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar。

  • AppClassLoader:主要负责加载应用程序的主函数类

    那如果有一个我们写的Hello.java编译成的Hello.class文件,它是如何被加载到JVM中的呢?别着急,请继续往下看。

双亲委派机制

我打开了我的AndroidStudio,搜索了下“ClassLoader”,然后打开“java.lang”包下的ClassLoader类。然后将代码翻到loadClass方法:

    public Class<?> loadClass(String name) throws ClassNotFoundException {
        return loadClass(name, false);
    }
    //              -----??-----
    protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
            // 首先,检查是否已经被类加载器加载过
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                try {
                    // 存在父加载器,递归的交由父加载器
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        // 直到最上面的Bootstrap类加载器
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    c = findClass(name);
                }
            }
            return c;
    }

其实这段代码已经很好的解释了双亲委派机制,为了大家更容易理解,我做了一张图来描述一下上面这段代码的流程:  

通俗易懂的双亲委派机制

 
从上图中我们就更容易理解了,当一个Hello.class这样的文件要被加载时。不考虑我们自定义类加载器,首先会在AppClassLoader中检查是否加载过,如果有那就无需再加载了。如果没有,那么会拿到父加载器,然后调用父加载器的loadClass方法。父类中同理也会先检查自己是否已经加载过,如果没有再往上。注意这个类似递归的过程,直到到达Bootstrap classLoader之前,都是在检查是否加载过,并不会选择自己去加载。直到BootstrapClassLoader,已经没有父加载器了,这时候开始考虑自己是否能加载了,如果自己无法加载,会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException。那么有人就有下面这种疑问了?

为什么要设计这种机制

这种设计有个好处是,如果有人想替换系统级别的类:String.java。篡改它的实现,在这种机制下这些系统的类已经被Bootstrap classLoader加载过了(为什么?因为当一个类需要加载的时候,最先去尝试加载的就是BootstrapClassLoader),所以其他类加载器并没有机会再去加载,从一定程度上防止了危险代码的植入。

总结了一张脑图如下:

通俗易懂的双亲委派机制

参加CSDN 1024当天比赛文章,学Java的看完不点赞你再来打我

想成为Java开发专家,了解这些还远远不够,我这里总结了一些Java知识的史上最全脑图:

等等等还有五十几张脑图等着你,不光是脑图,知识点的讲解也会在下面的公众号第一时间发布哦,赶紧来关注吧~

微信搜索:IT烂笔头  或者微信扫描二维码,关注回复【职场】获得作者好友位

通俗易懂的双亲委派机制

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142227.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java内存管理

    Java内存管理

    2020年11月12日
    195
  • ssh2登录方式_ssh端口号

    ssh2登录方式_ssh端口号SSH2登录:我们确认一下能否不输入口令就用ssh登录localhost:$sshlocalhost若是不输入口令就无法用ssh登陆localhost,执行下面的指令:$rm-fr~/.ss

    2022年8月4日
    5
  • Hive 数据类型

    Hive 数据类型简介以下介绍Hive的数据类型,Hive的数据类型分为四种类型,分别是:列类型文字Null值复杂类型列类型整型可以指定使用整型数据类型,下表描述了各种INT数据类型。(TINYINT&amp;amp;amp;lt;SMALLINT&amp;amp;amp;lt;INT&amp;amp;amp;lt;BIGINT)类型(后缀)示例TINYINT(Y)10YSMALLINT(S)1

    2022年9月22日
    0
  • opencv3编程入门_java基础与入门教程

    opencv3编程入门_java基础与入门教程——韦访 201810111、概述想学习图像处理,不管是机器学习也好,深度学习也好,不会点OpenCV好像有点说不过去吧?所以,现在开始OpenCV的学习。2、读写图片先从图片的读写开始,opencv读取图片的函数是imread,默认情况下,imread函数返回BGR格式的图像,可以用imwrite函数将数据写到本地。下面的代码会将JPG图片转成PNG。import…

    2022年10月3日
    0
  • let/const 的变量提升与暂时性死区

    let/const 的变量提升与暂时性死区在面试或一些文章中提到var和let/const区别时,总说var有变量提升,let/const不存在变量提升,这种说法是错误的.var和let/const都有变量提升,但是let/const暂时性死区的存在要求调用该类变量前必须先经过显式赋值

    2022年6月23日
    47
  • php 覆盖率_java代码覆盖率工具

    php 覆盖率_java代码覆盖率工具简介:最近研究了PHP代码覆盖率的测试,后面发现了github一个开源项目(https://github.com/sebastianbergmann/php-code-coverage),对PHP代码覆盖率测试已经做得很好了,所以拿来直接用,这里总结怎么用这个开源项目。环境搭建一、安装php环境1、php要选高版本,亲测7.27可行,5.5就不行二、安装xdebug这个直接网上搜怎么安…

    2022年10月2日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号