Java自定义类加载器的父加载器问题

无_名 2014-11-06 10:10:15
先看一句书上的原话:
对于系统提供的类加载器来说,系统类加载器的父类加载器是扩展类加载器,而扩展类加载器的
父类加载器是引导类加载器;对于开发人员编写的类加载器来说,其父类加载器是加载此类加载器 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 的加载器也不同啊,为什么不会报这个错呢。
...全文
354 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

50,535

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧