責任のパターンのチェーンチェーンは、レシーバ・オブジェクト要求は、受信者のこのようなデカップリングリクエスタを作成し、
受信者の特定の実装を気にすることなく、更に要求者は、受信者は、単にチェーンに要求を渡します。
以下は、ロードされたクラス、ファーストクラスの最上位BootstrapClassLoaderに、親委譲を用いクラスローディング機構の一例を与えます
負荷がBootstrapClassLoaderをロードすることができますされている場合は、ロードされていない場合は、次のステージExtensionClassLoader。ロードに渡され、
ロードは、次のステージローダーApplicationClassLoaderに渡さ逆に、ロードすることである場合。
最終的にはすべてのクラスローダがロードできないまで、というように、クラスローダは、例外がスローされます。
まず、私たちは抽象クラスのクラスローダ以降のBootstrapClassLoaderを作成し、ExtensionClassLoaderは抽象クラスを継承など
パブリック 抽象 クラスのClassLoader { パブリック 静的 INT bootstrp = 1 ; 公共の 静的 int型の EXTENSION = 2 ; 公共の 静的 INT APPLICATION = 3 ; 保護 int型優先; // 現在の優先クラスローダ // 次段ローダは、 保護されたクラスローダnextClassLoaderと、 公衆 ボイドsetNextClassLoader(クラスローダnextClassLoader){ この .nextClassLoader = nextClassLoader; } 公共 ボイドrunLoader(文字クラス名、int型の優先順位){ System.out.printlnは( "現在の優先順位のローダ:" + この .priority + " -現在の優先度クラス:" + 優先); IF(この .priority ==優先) { // 現在のクラスがインストールされているロードすることができる ローダ(クラス名); } 他 { //ロードできない現在のクラスローダ次のステージに渡され、現在のクラスローダを IF(!nextClassLoader = NULL ){ //もしクラスローダが存在しそうでなければ例外がスローされ、次のステージに渡されます。 // のSystem.out.println( " - " + this.priority + ":" +優先); nextClassLoader.runLoader(クラス名、優先); } そう{ // 現在の負荷がロードされず、それ以降の負荷がNULLクラスローダがスローされるが失敗 するSystem.out.printlnを(「クラスローダ失敗」); } } } パブリック 抽象 ボイドローダー(文字クラス名); }
ローダの優先順位に等しい優先度クラスは、ローダは、ロードされた呼び出された場合、優先度クラスを設定すると、第一級BootstrapClassLoaderに送信優先順位を有しています。
そうでない場合nextClassLoader.runLoader(クラス名、優先順位)をロードすることによって、次のステージに通過し、最終的にローダ下で例外がスローされません。
クラスローダのサブクラスは、初期化時に2つのことを行う必要があります:
図1に示すように、現在のクラスローダの構築方法で指定された優先順位、
図2に示すように、次はsetNextClassLoader親クラス、ロードチェーン構成で現在のクラスローダのクラスローダを指定します。
BootstrapClassLoader
パブリック クラス BootstrapClassLoaderが延びているクラスローダ{ 公共 BootstrapClassLoader(int型の優先順位){ この .priority = 優先度を、 } @Override 公共 ボイドローダ(文字クラス名){ // TODO自動生成方法スタブ のSystem.out.println( "BootstrapClassLoader:" + クラス名)。 } }
ExtensionClassLoader
パブリック クラス ExtensionClassLoaderが延びているクラスローダ{ 公共 ExtensionClassLoader(int型の優先順位){ この .priority = 優先度を、 } @Override 公共 ボイドローダ(文字クラス名){ // TODO自動生成方法スタブ のSystem.out.println( "ExtensionClassLoader:" + クラス名)。 } }
ApplicationClassLoader
パブリック クラス ApplicationClassLoaderが延びているクラスローダ{ 公共 ApplicationClassLoader(int型の優先順位){ この .priority = 優先度を、 } @Override 公共 ボイドローダ(文字クラス名){ // TODO自動生成方法スタブ のSystem.out.println( "ApplicationClassLoader:" + クラス名)。 } }
メイン
パブリック クラスメイン{ パブリック 静的クラスローダbuildLoaderChain(){ // 各ローダの優先度設定 のClassLoader bootstrapClassLoader = 新しい新; BootstrapClassLoader(ClassLoader.BOOTSTRP) のClassLoader extensionClassLoader = 新しい新しいExtensionClassLoader(ClassLoader.EXTENSION); クラスローダapplicationClassLoader = 新しい新しいApplicationClassLoader(ClassLoader.APPLICATIONを); // 設定責任鎖bootstrap-> EXTENSION->アプリケーション、 // 優先順位123 //あなたはその上の拡張子に渡す、とすることができない場合は、最初のブートストラップローダに渡されたが、その後、ロードすることができます。 // 担当ノード優先鎖単一優先度クラスがロードされた場合== // 構成されたロードチェーン bootstrapClassLoader.setNextClassLoader(extensionClassLoader); extensionClassLoader.setNextClassLoader(applicationClassLoader); 戻りbootstrapClassLoaderを; } パブリック 静的 ボイドメイン(文字列引数[]) { たClassLoaderクラスローダ = buildLoaderChain(); classLoader.runLoader( ; "bootstrp"、ClassLoader.BOOTSTRP) // 。ブートストラップローディング1に classLoader.runLoader( "EXTENSION"、ClassLoader.EXTENSION); // 拡張ローディング1-> 2 classLoader.runLoader( "APPLICATION"、ClassLoader.APPLICATION)。// アプリケーション加载1-> 2-> 3 } }
実行結果:
現在の優先度のローダー:現在のクラス1-- :. 1の優先順位 bootstrpの:BootstrapClassLoader 現在の優先度のローダー: 1--現在のクラスの優先順位:2 :現在の優先度のローダー 2--現在のクラスの優先順位: 2 ExtensionClassLoader:拡張 現在の優先順位のローダ: 1--現在のクラスの優先順位:3 現在の優先順位のローダ: 2--現在のクラスの優先順位:3 現在の優先順位のローダ: 3--現在のクラスの優先順位:3 ApplicationClassLoader :APPLICATION
参考文献:
https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html