java.lang.ClassLoader详解 - TongtongLan/Java GitHub Wiki

通过JDK源码看java.lang.ClassLoader的核心方法 loadClass()的实现:

//提供class类的二进制名称表示,加载对应class,加载成功,则返回表示该类对应的Class<T> instance 实例

public Class<?> loadClass(String name) throws ClassNotFoundException {

return loadClass(name, false);  

}

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {

synchronized (getClassLoadingLock(name)) {  
    // 首先,检查是否已经被当前的类加载器记载过了,如果已经被加载,直接返回对应的Class<T>实例  
    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;  
}  

}