web-dev-qa-db-ja.com

Thread.currentThread()classLoaderと通常のclassLoaderの違い

Thread.currentThread().getContextClassLoader()TestServlet.class.getClassLoader()の違いは何ですか?重複としてマークしないでください。また、これらを使用する場合の例を説明し、提供してください

Javaファイル:

package com.jar.test;

public class TestServlet {
    public static void main(String args[]) {    
        ClassLoader cls = TestServlet.class.getClassLoader().loadClass(
                "com.jar.test.TestServlet");
        ClassLoader cls = Thread.currentThread().getContextClassLoader()
                .loadClass("com.jar.test.TestServlet");
    }
}
11
sidhartha pani

Thread.currentThread().getContextClassLoader()

このClassLoaderのコンテキストThreadを返します。コンテキストClassLoaderは、クラスとリソースをロードするときにこのスレッドで実行されるコードで使用するために、スレッドの作成者によって提供されます。設定されていない場合、デフォルトは親スレッドのClassLoaderコンテキストです。原始スレッドのコンテキストClassLoaderは通常、アプリケーションのロードに使用されるクラスローダーに設定されます。

Class#getClassLoader()

クラスのクラスローダーを返します。一部の実装では、nullを使用してbootstrapクラスローダーを表す場合があります。このクラスがbootstrapクラスローダーによってロードされた場合、このメソッドはそのような実装でnullを返します。


一言で言えば:

Thread.currentThread().getContextClassLoader() は、 setContextClassLoader(ClassLoader cl) で設定されたスレッドのコンテキストのClassLoaderです。 ClassLoaderの階層を持つ複雑なJavaアプリケーション(たとえば、アプリケーションサーバー)があり、現在のスレッドでこの階層内の1つの特定のClassLoaderからクラスまたはリソースをロードしたいとします。スレッドのコンテキストClassLoaderをこの特定のClassLoaderに設定するだけです。

Class#getClassLoader() は、単にClassLoaderのインスタンスがロードされたClassです。

8
Nicolas Filotto

Thread.currentThread()。getContextClassLoader()

これは現在のスレッドクラスローダーであり、それを呼び出すクラスに依存しません

TestServlet.class.getClassLoader()

これは、TestServletクラスをロードしたクラスローダーです。

これらをいつ使用するかを説明し、例を教えてください

ClassLoader1がThread1を所有し、ClassLoader2がThread2を所有していると想像してみてください。 TestServletクラスを(ClassLoader2によって)Thread2にロードしてから、それをThread1に渡すことができます。その時点で、TestServletがClassLoader1が所有するクラスをロードする必要がある場合、それ自体のClassLoaderはClassLoader1ではなくClassLoader2であるため、Thread.currentThread()。getContextClassLoader()を使用する必要があります。

4
Rubasace