1

クラスをロードするためにをClass.forName(String className)使用した印象がありましたが、そうではないようです。Thread.currentThread().getContextClassLoader()

したがって、私の質問ですが、 ClassLoaderはClass.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 に答える