首页 > JVM > 双亲委派模型

双亲委派模型

作者:bin

类加载器主要又三种:

  • 1.启动类加载器(Bootstrap ClassLoader)
  • 2.扩展类加载器(Extension ClassLoader)
  • 3.应用程序类加载器(Application ClassLoader)
  • 我们还可以自定义自己的类加载器,下面为类加载器双亲委派模型

    双亲委派的工作过程是:

  • 1.如果一个类加载器收到了类加载的请求,它不会首先自己去加载这个类,而是把这个请求委派给父类加载器去完成。
  • 2.加载过程很简单,先检查是否已经加载过,若没有加载过则调用父亲类的加载器的loadClass()方法
  • loadClass()方法:

    protected Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException
        {
            synchronized (getClassLoadingLock(name)) {
                // 首先,检查该类是否已经加载
                Class<?> c = findLoadedClass(name);
                if (c == null) {
                    long t0 = System.nanoTime();
                    try {
                        if (parent != null) {
                            c = parent.loadClass(name, false);
                        } else {
                            c = findBootstrapClassOrNull(name);
                        }
                    } catch (ClassNotFoundException e) {
                       //如果从非空父类加载器中找不到类,则抛出ClassNotFoundException
                    }
    
                    if (c == null) {
                        // 如果仍然找不到,请调用findClass以便找到该类
                        long t1 = System.nanoTime();
                        c = findClass(name);
    
                        // 这是定义类加载器;记录统计数据
                        sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                        sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                        sun.misc.PerfCounter.getFindClasses().increment();
                    }
                }
                if (resolve) {
                    //链接
                    resolveClass(c);
                }
                return c;
            }
        }
    

    您必须 [ 登录 ] 才能发表留言!