2017-05-03 14 views
0

私はJavaのインタビューで尋ねられました。わかっているように、親委託モデルのため、Javaクラスローダーはクラスを一度しかロードしません。だから私の答えは、カスタムクラスローダーを使用して読み込むことです。そうですか?この質問に答えるには?JVMでクラスローダーを使用してクラスを2回ロードするには?

+0

意味しますか? – EJP

+0

@ EJP、はい、あなたは正しくです – flower

+0

2つの異なるクラスローダーを使用します –

答えて

2

によって異なります。修飾名がjava.で始まるクラスは、ブートストラップローダによってのみロードされるため、2回目にロードされることはありません。ブートストラップローダによってロードされる他のすべてのクラスは、ブートストラップローダがすべてのローダの親であるため、親デリゲートモデルに従わないカスタムクラスローダ実装によってのみロードできます。

ClassLoaderインスタンスでロードされる他のすべてのクラスでは、親委託モデルに続いてローダーを親として持たない標準クラスローダを構築することができます。もちろん、カスタムローダを使用してロードすることもできますが、デリゲートモデルに従うことはできません。その選択は、元々同じローダによってロードされた、そのクラスによって参照される他のクラスをどのように処理するかによって異なります。それらを再ロードして、その環境の完全なコピーを作成するか、元のローダにローディングをリダイレクトしようとします。逆参照があると問題が発生します。

次のコード例では、アプローチを示しています。あなたは二回* *クラスをロード

public class ReloadMySelf { 
    public static void main(String[] args) throws IOException, ClassNotFoundException { 
     final Class<?> o = ReloadMySelf.class; 
     URL loc = o.getProtectionDomain().getCodeSource().getLocation(); 
     ClassLoader parent = o.getClassLoader().getParent(); 
     try(URLClassLoader cl = new URLClassLoader(new URL[]{loc}, parent)) { 
      Class<?> duplicate = cl.loadClass(o.getName()); 
      System.out.println("original: "+o+" ("+o.getClassLoader()+')'); 
      System.out.println("duplicate: "+duplicate+" ("+duplicate.getClassLoader()+')'); 
     } 
    } 
} 
関連する問題