java类加载器与双亲委派机制详解

1. java类加载过程

类加载器java.lang.ClassLoader:

负责查找、加载、校验字节码的应用程序

  • load(String className) 根据名字加载一个类,返回类的实例
  • defineClass(String name, byte[] b, int off, int len) 将一个字节流定义一个类
  • findClass(String name) 查找一个类
  • findLoadedClass(String name) 在已加载的类中,查找一个类
  • 成员变量 ClassLoader parent;

JVM四级类加载器:

  • 启动类加载器(Bootstrap),C语言编写,负责加载核心Java Class
  • 扩展类加载器(Extension),jre/lib/ext
  • 应用类加载器(App),classpath
  • 用户自定义加载器(Plugin),程序自定义,通过继承ClassLoader父类来创建自己的类加载器

2. 双亲委托模型

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);//首先查找这个类是否被加载
            if (c == null) {
                if (parent != null) {
                    c = parent.loadClass(name, false);//调用他的父加载器进行类加载,进行递归调用
                } else {
                    c = findBootstrapClassOrNull(name);//由bootStrap类加载
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);//查找自己的类加载器能否加载此类,如果有则加载,给c赋值,c不为空,所以结束各层的调用

                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

原文地址:https://www.cnblogs.com/innndown/p/12372562.html