JAvaクラスローダと親クラス委任メカニズム

1838 ワード

1.クラスローダ
Java仮想マシンには複数のクラスローダをインストールすることができ、システムのデフォルトでは主に3つのクラスローダがあり、各クラスは特定の場所のクラスをロードする責任を負う:BootStrap(java仮想マシンに埋め込まれてC++で書かれている)、ExtClassLoader、AppClassLoader.もちろんクラスローダをカスタマイズすることもでき、カスタムローダはClassLoaderを継承しなければならない.
Java仮想マシン内のすべてのクラス・ローダは、親子関係を持つツリー構造で構成されています.各クラス・ローダ・オブジェクトをインスタンス化する場合は、親クラス・ローダ・オブジェクトを指定するか、デフォルトでシステム・クラス・ローダを使用して親クラスにロードする必要があります.
2.次のコードを見てみましょう.
1
2
3
4
5
6
7
8
9
10 public   class   ClassLoaderTest { public   static   void   main(String[] args) { ClassLoader loader = ClassLoaderTest. class .getClassLoader(); while   (loader !=  null ) { System.out.println(loader.getClass().getName()); loader = loader.getParent(); } System.out.println(loader); } }
//前後出力:
//sun.misc.Launcher$AppClassLoader
//sun.misc.Launcher$ExtClassLoader
//null:注nullはBootStrapクラスのローダを表します.このローダはトップクラスのローダで、親クラスのローダはありません.
 
3.クラス・ローダ間の親子関係と管轄範囲:
BootStrap->ExtClassLoader->AppClassLoader(通常はSystem ClassLoader)
それらの管轄範囲はBootStrap-->JRE/lib/rt.jar ExtClassLoader-->JRE/lib/ext/*の順である.JAr AppClassLoader------->CLASSPATHで指定したすべてのjarまたはディレクトリ.
4.親委託メカニズム
親委任メカニズムは、最上位レベルの起動クラスローダを除いて、残りのクラスローダには独自の親クラスローダがある必要があります.以前に見たjavaチュートリアルの多くでは、クラス・ローダ間の親子関係は一般的に継承された関係ではなく、親ローダのコードを多重化するために組合せ関係を使用していると説明しています.
親委任メカニズムの作業手順は、クラス・ローダがクラス・ローダの要求を受信した場合、彼はまず自分でクラスをロードしようとするのではなく、この要求を親ローダに委任して完了します.各階層のクラス・ローダはそうです.そのため、すべてのローダ要求は最終的に最上位の起動クラス・ローダに転送されます.親ローダがこのロード要求を完了できないとフィードバックした場合にのみ、サブローダは自分でロードしようとします.
次に、クラス・ローダ・レベルを示します.