現実に実行するスレッドコンテキストクラスローダの性質の分析
1.スレッドコンテキストクラスローダ
-
ランチャークラス:スレッドのコンテキストクラスローダは、主に起因して、システムのデフォルトのクラスローダであります:
Thread.currentThread()setContextClassLoader(this.loader);.パラメータとしてローダー、ローダーを作成した後、直接に入ります
-
例1:
-
public class MyTest25 implements Runnable{ private Thread thread; public MyTest25(){ thread = new Thread(this); thread.start(); } @Override public void run() { ClassLoader classLoader = this.thread.getContextClassLoader(); this.thread.setContextClassLoader(classLoader); System.out.println("Class: "+classLoader.getClass()); System.out.println("Parent: "+classLoader.getParent().getClass()); } public static void main(String[] args) { new MyTest25(); } } 运行结果: Class: class sun.misc.Launcher$AppClassLoader //线程上下文类加载器默认是系统类加载器 Parent: class sun.misc.Launcher$ExtClassLoader
-
2.スレッドコンテキストクラスローダを使用する通常のパターン(取得 - 用途 - 還元)
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); //获取
try{
Thread.currentThread.setContextClassLoader(targetTccl); //设置
myMethod(); //使用
}finally{
Thread.currentThread.setContextClassLoader(classLoader); //还原
}
-
要約:
- )にThread.currentThread()。getContextClassLoader(と呼ばれるMyMethodはは、現在のスレッドのコンテキストクラスローダが特定の物事を行うために取得します。
- クラスローダがクラスAをロードする場合は(ない場合は、それに依存するクラスの前に、ローダ上)、そのクラスに依存するクラスが同じクラスローダによってロードされています
- ★ContextClassloaderと効果はJavaのクラスローディング委譲メカニズムを弱体化することです。
- ★幹部は、クラスのボトムレベルにロード(またはインスタンス化)しつつ、底が達成することを可能にする統一されたインタフェースを提供する時、それは見つけてクラスをロードするためにスレッドコンテキストClassLoaderクラスローダによってヘルプ幹部に必要です。