1

我的印象是Class.forName(String className)使用Thread.currentThread().getContextClassLoader()来加载类,但显然情况并非如此。

因此我的问题是,ClassLoaderClass.forName默认使用什么?是ClassLoader.getSystemClassLoader()吗?

Thread.currentThread().getContextClassLoader()和和有什么区别ClassLoader.getSystemClassLoader()

4

2 回答 2

8

它使用调用者的类加载器。从文档中

返回与具有给定字符串名称的类或接口关联的 Class 对象。调用此方法等效于:

Class.forName(className, true, currentLoader)

其中 currentLoader 表示当前类的定义类加载器。

于 2012-06-22T08:19:18.070 回答
2

它使用调用程序类加载器。forName() 的源代码:

public static Class<?> forName(String className) 
                throws ClassNotFoundException {
        return forName0(className, true, ClassLoader.getCallerClassLoader());
    }

getCallerClassLoader() 是:

static ClassLoader getCallerClassLoader() {
        // NOTE use of more generic Reflection.getCallerClass()
        Class caller = Reflection.getCallerClass(3);
        // This can be null if the VM is requesting it
        if (caller == null) {
            return null;
        }
        // Circumvent security check since this is package-private
        return caller.getClassLoader0();
    }

这种方法的描述是:

// Returns the invoker's class loader, or null if none.
于 2012-06-22T08:41:00.493 回答