0

次のコードはからのものjava.sql.DriverManagerです:

public static Connection getConnection(String url,String user, String password)    {
    // Gets the classloader of the code that called this method, may 
    // be null.
    ClassLoader callerCL = DriverManager.getCallerClassLoader();
    return (getConnection(url, info, callerCL));
 }

私の最初の質問は、の結果値DriverManager.getCallerClassLoader();がnullになる可能性がある理由です。呼び出し元のクラスはユーザー自身のクラスである必要があり、通常はAppClassLoaderです。

上記のコードのサブシーケンスgetConnection(url, info, callerCL)、およびメソッド本体には、次のコードスニペットが含まれています。

if(callerCL == null) {
    callerCL = Thread.currentThread().getContextClassLoader();
}    

何のThread.currentThread().getContextClassLoader()ために?ドキュメントを確認しましたが、理解できません。

ありがとう。

4

1 に答える 1

0

最初の質問に答えるには、

の結果値DriverManager.getCallerClassLoader();がnullになるのはなぜですか?

それは、クラスで定義されている方法を見るとDriverManager

/* Returns the caller's class loader, or null if none */
    private static native ClassLoader getCallerClassLoader();

そのネイティブメソッドとnull値を返すことができます。

2番目の質問に答えるには:

何のThread.currentThread().getContextClassLoader()ために?

すべてのスレッドには、クラスローダーが関連付けられています。スレッドがメインスレッドの場合、それに関連付けられているクラスローダーはシステムクラスローダーです。

多くの場合、1つのクラスローダーでオブジェクトを作成すると、このオブジェクトは、他のクラスローダーで開始されたスレッドで使用される可能性があります。したがってgetContextClassLoader()、オブジェクトをロードしたクラスローダーではなく、スレッドのクラスローダーで使用可能なリソースにアクセスできるクラスローダーにアクセスできます。

これは同じフォーラムの別のスレッドで、同じトピックについて詳しく説明しています。

于 2012-11-09T13:11:01.430 に答える