public class MyTest20 {
public static void main(String[] args) throws Exception{
MyTest16 loader1 = new MyTest16("loader1");
MyTest16 loader2 = new MyTest16("loader2");
Class<?> clazz1 = loader1.loadClass("com.yshuoo.jvm.classloader.MyPerson");
Class<?> clazz2 = loader2.loadClass("com.yshuoo.jvm.classloader.MyPerson");
System.out.println(clazz1 == clazz2);
Object o1 = clazz1.newInstance();
Object o2 = clazz2.newInstance();
Method method = clazz1.getMethod("setMyPerson", Object.class);
method.invoke(o1,o2);
}
}
直接运行,结果为true,是因为loader1和loader2都委托应用类加载器去加载MyPerson
编写MyTest21,指定加载MyPerson路径,并将MyPerson.class复制到指定目录,删除target里的MyPerson.class
public class MyTest21 {
public static void main(String[] args) throws Exception{
MyTest16 loader1 = new MyTest16("loader1");
MyTest16 loader2 = new MyTest16("loader2");
loader1.setPath("D:\\workspace\\");
loader2.setPath("D:\\workspace\\");
Class<?> clazz1 = loader1.loadClass("com.yshuoo.jvm.classloader.MyPerson");
Class<?> clazz2 = loader2.loadClass("com.yshuoo.jvm.classloader.MyPerson");
System.out.println(clazz1 == clazz2);
Object o1 = clazz1.newInstance();
Object o2 = clazz2.newInstance();
Method method = clazz1.getMethod("setMyPerson", Object.class);
method.invoke(o1,o2);
}
}
输出为false后抛出异常,clazz1与c;azz2是由不同的类加载器加载,并且没有层级关系,所以属于不同的命名空间,虽然同名但是互相不可见