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");
}
}
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
です。
Thread.currentThread()。getContextClassLoader()
これは現在のスレッドクラスローダーであり、それを呼び出すクラスに依存しません
TestServlet.class.getClassLoader()
これは、TestServletクラスをロードしたクラスローダーです。
これらをいつ使用するかを説明し、例を教えてください
ClassLoader1がThread1を所有し、ClassLoader2がThread2を所有していると想像してみてください。 TestServletクラスを(ClassLoader2によって)Thread2にロードしてから、それをThread1に渡すことができます。その時点で、TestServletがClassLoader1が所有するクラスをロードする必要がある場合、それ自体のClassLoaderはClassLoader1ではなくClassLoader2であるため、Thread.currentThread()。getContextClassLoader()を使用する必要があります。