我有一个关于类加载概念的问题。如何在 JVM 中加载 .class 文件两次。我还在编写我为完成此任务而编写的代码摘录..
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)现在我正在使用这两个不同的类加载器加载一个名为 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@11b86e7 true 1641745 , 1641745
你能解释一下吗