クラスローディングの概念に関して1つ質問があります。JVMで.classファイルを2回ロードする方法。また、これを実現するために作成したコードの抜粋も作成しています。
1)ローダー1コード
public class MyClassLoader extends ClassLoader {
public MyClassLoader(){
super(MyClassLoader.class.getClassLoader());
}
public Class loadClass(String classname){
try {
return super.loadClass(classname);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
2)ローダー2コード
public class AnotherClassLoader extends ClassLoader {
public AnotherClassLoader(){
super(AnotherClassLoader.class.getClassLoader());
}
public Class loadClass(String classname){
try {
return super.loadClass(classname);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
3)この2つの異なるクラスローダーを使用して、Aという名前のクラスをロードしています。オペレーションclassA1==newClassAはfalseを返すはずだと思います。コードは次のとおりです。
public static void main(String[] args) {
MyClassLoader loader1 = new MyClassLoader();
AnotherClassLoader newLoader = new AnotherClassLoader();
System.out.println("Load with Custom Class Loader instance");
Class classA1 = loader1.loadClass("com.hitesh.coreJava.A");
System.out.println("Class Loader:::"+classA1.getClassLoader());
Class newClassA = newLoader.loadClass("com.hitesh.coreJava.A");
System.out.println("Class Loader:::"+newClassA.getClassLoader());
System.out.println(classA1==newClassA);
System.out.println(classA1.hashCode() + " , " + newClassA.hashCode());
}
4)上記のコードを実行した結果:
カスタムクラスローダーインスタンスを使用してロードするクラスローダー:::sun.misc.Launcher$AppClassLoader@11b86e7クラスローダー:::sun.misc.Launcher$AppClassLoader@11b86e7true 1641745、1641745
これを説明していただけませんか