Java类加载器加载类的过程

来源:互联网 发布:解忧杂货店淘宝 编辑:程序博客网 时间:2024/06/02 04:34

首先判断该类是否已加载,如果已加载,返回对应的java.lang.Class对象;如果没加载,判断父加载器是否为空,如果不为空,用父加载器来加载,如果加载成功,直接返回,否则用当前类的加载器来加载;如果父记载器为空,则调用根加载器来加载,如果加载成功,返回对应的java.lang.Class对象,否则抛出ClassNotfoundException。

源码如下:

    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) {                long t0 = System.nanoTime();                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.                    long t1 = System.nanoTime();                    c = findClass(name);                    // this is the defining class loader; record the stats                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);                    sun.misc.PerfCounter.getFindClasses().increment();                }            }            if (resolve) {                resolveClass(c);            }            return c;        }    }