美文网首页我爱编程
浅析双亲委派模型

浅析双亲委派模型

作者: 关玮琳linSir | 来源:发表于2018-04-13 15:06 被阅读210次

    常用的类加载器:

    • Bootstrap ClassLoader
    • Extension ClassLoader
    • ApplicationClassLoader。

    (1)类和类加载器
    类加载器拥有自己独立的命名空间,两个类是否相等(instanceof),只有在这两个类是同一个类加载器加载的才有意义。

    (2)双亲委派模型
    从Java虚拟机的角度来说,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现(HotSpot虚拟机中),是虚拟机自身的一部分;另一种就是所有其他的类加载器,这些类加载器都有Java语言实现,独立于虚拟机外部,并且全部继承自抽象类java.lang.ClassLoader。
    从开发者的角度,类加载器可以细分为:

    • 启动(Bootstrap)类加载器:负责将 Java_Home/lib下面的类库加载到内存中(比如rt.jar)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。
    • 标准扩展(Extension)类加载器:是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将Java_Home /lib/ext或者由系统变量 java.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。
    • 应用程序(Application)类加载器:是由 Sun 的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,因此一般称为系统(System)加载器。
    除此之外,还有自定义的类加载器,它们之间的层次关系被称为类加载器的双亲委派模型。该模型要求除了顶层的启动类加载器外,其余的类加载器都应该有自己的父类加载器,而这种父子关系一般通过组合(Composition)关系来实现,而不是通过继承(Inheritance)。

    双亲委派模型:

    某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。这一点是从安全角度考虑的,试想如果有人编写了一个恶意的基础类(如java.lang.String)并装载到JVM中将会引起多么可怕的后果。但是由于有了“全盘负责委托机制”,java.lang.String永远是由根装载器来装载的,这样就避免了上述事件的发生。

    双亲委派模型的实现:

    很简单,全在loadClass中实现,在java.lang.ClassLoader的loadClass()方法中,先检查是否已经被加载过,若没有加载则调用父类加载器的loadClass()方法,若父加载器为空则默认使用启动类加载器作为父加载器。如果父加载失败,则抛出ClassNotFoundException异常后,再调用自己的findClass()方法进行加载。

    
        protected synchronized Class<?> loadClass(String name,boolean resolve)throws ClassNotFoundException{
        //check the class has been loaded or not
        Class c = findLoadedClass(name);
        if(c == null){
            try{
                if(parent != null){
                    c = parent.loadClass(name,false);
                }else{
                    c = findBootstrapClassOrNull(name);
                }
            }catch(ClassNotFoundException e){
                //if throws the exception ,the father can not complete the load
            }
            if(c == null){
                c = findClass(name);
            }
        }
        if(resolve){
            resolveClass(c);
        }
        return c;
    }
    
    双亲委派模型打破:
    重写loadClass方法。
    

    相关文章

      网友评论

        本文标题:浅析双亲委派模型

        本文链接:https://www.haomeiwen.com/subject/nvickftx.html