命名空间:
每个类加载器都有自己的命名空间,命名空间由该类加载器及其父类加载器所加载的类组成。
在同一个命名空间中,不会出现类的完整名字(包括类的包名)相同的两个类。
在不同的命名空间中,有可能出现类的完整名字(包括类的包名)相同的两个类。
关于命名空间的重要说明:
1、子加载器加载的类能够访问父加载器所加载的类
2、父加载器加载的类不能访问子加载器所加载的类
实例代码
/**
* @author dc
* @date 2020/6/13 - 10:51
*/
public class Sample {
public Sample(){
System.out.println("Sample is loaded by " + this.getClass().getClassLoader());
//Cat类是由加载Sample类的加载器试着加载,或者委派给双亲,不能委派给孩子
//也就是说加载Sample类的加载器级别必须比加载Cat类的加载器的级别高。
Cat cat = new Cat();
System.out.println("Cat class = " + Cat.class);
}
}
/**
* @author dc
* @date 2020/6/13 - 10:49
*/
public class Cat {
public Cat(){
System.out.println("Cat is loaded by " + this.getClass().getClassLoader());
System.out.println("Sample class = " + Sample.class);
}
}
/**
* @author dc
* @date 2020/6/13 - 11:20
*/
public class MyTest10_1 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
//定义自定义的类加载器
MyTest9 loader = new MyTest9("loader");
//为加载器设置加载的路径
loader.setPath("C:\\Users\\Windows10\\Desktop\\test\\");
//加载Sample的字节码文件
Class<?> clazz = loader.loadClass("Sample");
//输出字节码对象的hash码
System.out.println(clazz.hashCode());
/*创建class对象的实例
* 如果该行代码注释了,那么就仅仅加载Sample类,
* 不会加载Cat类
* */
Object o = clazz.newInstance();
}
}