专栏首页中国Android研究院3分钟了解Java双亲委派机制

3分钟了解Java双亲委派机制

你得先知道

在介绍双亲委派机制的时候,不得不提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.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
    {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        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之前,都是没有哪个加载器自己选择加载的。如果父加载器无法加载,会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException

为什么要设计这种机制

这种设计有个好处是,如果有人想替换系统级别的类:String.java。篡改它的实现,但是在这种机制下这些系统的类已经被Bootstrap classLoader加载过了,所以并不会再去加载,从一定程度上防止了危险代码的植入。

如果对你有一点点的帮助,欢迎关注??获取更多知识哦~

本文分享自微信公众号 - 南京Android部落(nj_android),作者:Bob

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自定义控件之带渐变色的圆形进度条

    七夕到了,祝大家七夕节快乐! 今天给大家讲解一个简单的进度条的自定义。首页呢,我们看下效果图:

    吴延宝
  • 高工做CPU架构适配的心得体会

    如上图所示,armabi的库可以运行在x86、x86-64以及armabi-v7a和armabi-v8a的CPU架构上,从下往上的方向上,下方架构的so库可以兼...

    吴延宝
  • 官宣!抓住年终的尾巴提升一下自己

    眼瞅着2018年只剩下两个多月了,小伙伴们年初定的小目标都实现了吗? 是不是该看的书还没来得及翻开?该学习的知识也没来得及学习?喏!现在机会来了,抓住201...

    吴延宝
  • JVM实战---类加载的过程

    在加载类时,使用的是Parents Delegation Model(溯源委派加载模型)

    JavaEdge
  • 类加载过程,双亲委派模型?

    java通过字节码和JVM机制,提供了强大的跨平台能力,理解Java的类加载机制能让我们更加了解java的运行过程

    居士
  • Java虚拟机 - 超级详细的类加载说明

    java文件在编译时会被JVM编译成.class字节码文件,这篇主要讲解的是JVM如何将.class文件加载的加载过程。

    虞大大
  • 图解Tomcat类加载机制

      说到本篇的tomcat类加载机制,不得不说翻译学习tomcat的初衷。   之前实习的时候学习javaMelody的源码,但是它是一个Maven的项目,...

    用户1154259
  • 类加载子系统

    类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。

    麋鹿大哥
  • 从微信、钉钉等APP,看六种常见的loading 加载设计

    当页面的框架固定时,只需要加载框架内数据时,采用这种刷新样式,即先加载框架,再加载框架内的数据。为了反之框架内的内容为空,会用占位符或者预设图片来填充。 上面简...

    企鹅号小编
  • 性能优化总结(四):预加载的设计

        本节说一下数据的预加载。这节的内容与SQL没什么关系。主要说的是在 GIX4项目 中,我们是如何设计符合需求的预加载类库的。内容如下: 什么是预加载,为...

    用户1172223

扫码关注云+社区

领取腾讯云代金券