在上一节的基础上创建MyTest17_1
public class MyTest17_1 {
public static void main(String[] args) throws Exception{
// 将系统类加载器当做loader1的父加载器
MyTest16 loader1 = new MyTest16("loader1");
loader1.setPath("D:\\workspace\\");
Class<?> clazz = loader1.loadClass("com.yshuoo.jvm.classloader.MySample");
System.out.println("class: " + clazz.hashCode());
Object object = clazz.newInstance();
}
}
只删除target里的MyCat,运行程序报错
只删除target里的MySample,运行正常
是由加载了MySample的类加载器去加载的MyCat
对MyCat做出如下改变
public class MyCat {
public MyCat(){
System.out.println("MyCat is loaded by: " + this.getClass().getClassLoader());
System.out.println("from MyCat: " + MySample.class);
}
}
删除target里的MySample,运行报错
对MySample进行改造,将MyCat的改变复原
public MySample(){
System.out.println("MySample is loaded by: " + this.getClass().getClassLoader());
new MyCat();
System.out.println("from MySample: " + MyCat.class);
}
public class MyCat {
public MyCat(){
System.out.println("MyCat is loaded by: " + this.getClass().getClassLoader());
}
}
重新编译后再次把MySample删掉,运行正常
关于命名空间的重要说明:
- 子加载器所加载的类能够访问到父加载器所加载的类
- 父加载器所加载的类无法访问到子加载器所加载的类