スレッドコンテキストクラスローダの分析と実装
例1:
public class MyTest24 {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getContextClassLoader());
System.out.println(Thread.class.getClassLoader());
}
}
运行结果:
sun.misc.Launcher$AppClassLoader@18b4aac2
null
現在のクラスローダ(現在のクラスローダ)
- 各クラスは、(依存クラスを参照)、他のクラスをロードするために、独自のクラスローダ(つまりローダー独自のクラスローダ)を使用します
例:ClassXは上品、背面に続いClassXクラスローダを引用した場合ローダーCLASSY(クラッシーがまだロードされていないことを条件とします)
クラスローダースレッドコンテキスト(コンテキストクラスローダ)
- 導入開始からJDK 1.2ローダースレッドのコンテキストクラス、ThreadクラスgetContextClassLoader()とsetContextClassLoader(ClassLoaderのC1)、それぞれ、取得および設定するコンテキストクラスローダ。
- setContextClassLoader(ClassLoaderのC1)を介して設定されていない場合、スレッドは、親コンテキストクラスローダのスレッドを継承します。初期スレッドのJavaアプリケーションのランタイム・コンテキスト・ローダーは、システムクラスローダです。スレッドで実行されているコードは、クラスとリソースクラスローダによってロードすることができます。
- スレッドコンテキストローダーの重要性:
- SPI(サービスプロバイダインタフェース)
- クラス[現在のスレッドにThread.currentThreadを使用することができる親クラスローダは、()。GetContextClassLoaderクラスローダは、負荷()を行います]。**これは、親委任モデルを変更しているクラスローダクラスローダが子や他の親子関係を直接ロードされていないクラスを使用することはできません状況のクラスローダの親、**を変更します。
- スレッドのコンテキストクラスローダは現在のスレッドの現在のClassLoaderです
- 親委任モデル、ボトムローディング式、委託をロードする、即ち、上下クラスローダで。しかし、いくつかのインターフェイスのためのSPIのJavaコアライブラリを提供し、負荷へのクラスローダを起動して、Javaのコアライブラリ、およびこれらのインタフェースを実装しますが、別のjarファイルパッケージ(ベンダー)から、Javaのです両親は従来のモデルは、SPIの要件を満たすことができない託すので、他の源であるローダーのjarパッケージを行い、ローダークラスを開始します。現在のクラスローダのコンテキストにスレッドセットを通して、文脈がローディングインタフェースクラスを実装するためのクラスローダに提供することができます。