JVMのスレッドのコンテキストクラスローダ

現在のクラスローダ(現在のクラスローダ)
各クラスは、(依存クラスを参照)、他のクラスをロードするために来て、独自のクラスローダ(自身をロードするために、すなわち、クラスローダ)を使用します
ClassXは上品を参照する場合、そのクラスローダClassXをデバイスは、CLASSY(CLASSYがまだロードされていないことを提供する)をロード行きます

Loaderのスレッドコンテキスト(コンテキストクラスローダ)
スレッドコンテキストはJDK1.2、ThreadクラスのgetContextLoader()とsetContextClassLoader(クラスローダCL)で導入され、ロードされている
取得するために使用されたコンテキストクラスローダを設定します

setContextClassLoader(クラスローダCL)を介して設定されていない場合、スレッドは親スレッドのコンテキストがロードされている継承されます。
初期スレッドのJavaアプリケーションの実行時のコンテキストローダーは、システムクラスローダです。スレッドで実行されているコードは、クラスとリソースクラスローダによってロードすることができます。

スレッドコンテキストローダーの重要性

そのようなJDBCのようなSPI(サービスプロバイダインタフェース)
親クラスローダ現在のスレッドにThread.currentThread()。GetContextClassLoader()指定されたクラスローダロードクラスを使用することができる
サブ親のClassLoaderクラスローダのClassLoader又は全く親子関係または他の負荷を使用して変更することができません親委任モデルを変更したクラスの場合

スレッドのコンテキストクラスローダは現在のスレッドの現在のClassLoaderです

以下のコードは、JDBC接続を使用して接続されているOralce

接続がrt.jarのパッケージjava.sqlでのある;で、ブートクラスローダによってロードされます。

、それはAppClassLoaderによってロードされます達成するためのOracle Connectionベンダーの具体的な実装があります。

これは、問題を引き起こすクラスローダがAppClassLoaderロードされたクラスにアクセスすることはできませんクラスをロードを開始します。

 

親委任モデルでは、クラスは、委託をロードする、即ち、上下クラスローダ、底部からロードされます。しかし、いくつかのインターフェイスのためのSPIのために提供するJavaコアライブラリであり、
そしてJavaのコアライブラリをロードするクラスローダを開始することにより、これらは、JARパッケージのインタフェースの異なる実装から来る(JDBCベンダの実装は、オラクルを持っていますMySQLの、など)は、Javaの起動クラスローダは、他のロードされません
両親は従来のモデルは、SPIの要件を満たすことができない託すように、ソースのjarパッケージを。現在のコンテキストクラスローダに設定されたスレッドを通じ、あなたはクラスローダがされているコンテキストによって提供することができる
クラスのインタフェースをロードするために実装します。

 

1、クラスMyTest24.javaを作成

パブリッククラスMyTest24 { 
    パブリック静的無効メイン(文字列[] args){ 
        System.out.printlnは(にThread.currentThread()getContextClassLoader())。// AppClassLoader 
        するSystem.out.println(Thread.class.getClassLoader()); //ヌル启动类加载器
    } 
}

  出力:

sun.misc.Launcher$AppClassLoader@18b4aac2 
はnull

  

おすすめ

転載: www.cnblogs.com/linlf03/p/11069014.html