先看一句书上的原话:
对于系统提供的类加载器来说,系统类加载器的父类加载器是扩展类加载器,而扩展类加载器的
父类加载器是引导类加载器;
对于开发人员编写的类加载器来说,其父类加载器是加载此类加载器 Java 类
的类加载器。
针对自定义的类加载器:我的理解是一般自定义加载器的父加载器都是系统类加载器,但如果一个自定义的类加载器是由另一个自定义的类加载器加载的,那么这个自定义的类加载器的父加载器就是那个另一个自定义的类加载器。
但是在看代码:
FileSystemClassLoader fsc=new FileSystemClassLoader("F:\\project\\eclipsespaces\\test\\bin");
Class test=fsc.findClass("com.test.FileSystemClassLoader");
Class[] a={String.class};
String [] b={""};
Constructor con=test.getConstructor(a);
ClassLoader cla= (ClassLoader) con.newInstance(b);
System.out.println(test.getClassLoader());
System.out.println(cla.getParent());
控制台输出结果
FileSystemClassLoader 是一个自定义的类加载器,通过这个类在将这个类加载器的在加载到内存中,可以看到是通过.findClass方法直接定义加载,并非用的loadClass,所以不存在向上委托。通过第一条语句的输出结果可以看出 test是由FileSystemClassLoader加载器加载的。
然后在通过反射创建一个该类加载器的实例,输出的父加载器还是系统类加载器。
到这里我就不明白了,不知道是我理解有错,还是分析的有问题,希望高手能解答下疑惑
另外还补充问一下:
ClassLoader cla= (ClassLoader) con.newInstance(b);
关于这句 在这个代码中如果换成
FileSystemClassLoader cla= (FileSystemClassLoader) con.newInstance(b);
会报错
java.lang.ClassCastException: com.test.FileSystemClassLoader cannot be cast to com.test.FileSystemClassLoader
我也不是很明白为什么转成父类就不报错,而转成自己本身的类就报错
我也明白是因为类加载器不通引起的,但是父类ClassLoader 的加载器也不同啊,为什么不会报这个错呢。