码迷,mamicode.com
首页 > 其他好文 > 详细

双亲委派

时间:2020-01-12 11:28:47      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:rap   div   protected   自定义   bootstrap   --   lang   width   tcl   

1、类加载器:虚拟机设计团队把加载动作放到 JVM 外部实现,以便让应用程序决定如何获取所需的类,JVM 提供了 3 种类加载器:

(1)启动类加载器(Bootstrap ClassLoader):负责加载 JAVA_HOME\lib 目录中的,或通过-Xbootclasspath 参数指定路径中的,且被虚拟机认可(按文件名识别,如 rt.jar)的类。

(2)扩展类加载器(Extension ClassLoader):负责加载 JAVA_HOME\lib\ext 目录中的,或通过 java.ext.dirs 系统变量指定路径中的类库。

(3)应用程序类加载器(Application ClassLoader):负责加载用户路径(classpath)上的类库。

(4)自定义类加载器(User ClassLoader):通过继承 java.lang.ClassLoader实现自定义的类加载器。

技术图片

 

 

2、双亲委派机制

  当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载器中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载。

  采用双亲委派的一个好处是,比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个 Object 对象。

技术图片

3、源码:打开“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;
    }

 

参考博客:https://blog.csdn.net/codeyanbao/article/details/82875064

双亲委派

标签:rap   div   protected   自定义   bootstrap   --   lang   width   tcl   

原文地址:https://www.cnblogs.com/guoyu1/p/12182107.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!