20_类加载器命名空间实战剖析与透彻理解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43277087/article/details/102736081

在这里插入图片描述
MyCat是谁加载的呢?

上文代码中,加载MySample的加载器,在使用MyCat的时候,去加载它。
如果,项目中删除MyCat.Class文件,当APPClassLoad不能加载它,自定义加载器明明可以加载它时,若MySample.Class被应用类加载器加载,那么MyCat.Class会被APPClassLoader和它的双亲尝试加载,但是都不能成功,若MyCat.Class加载不成功,直接报错
在这里插入图片描述
如果删除MySample.Class文件,留下MyCat.Class文件,自定义类可以加载MySample.Class,MyCat.Class可以被两种加载器加载,那么会是哪种呢?

在这里插入图片描述
在这里插入图片描述
因为自定义加载器会先委托给它爹AppClassLoader,而AppClassLoader正好可以加载此MyCat,所以。。。。。。。

改变下代码:
在MyCat中引用MySample类,其他不变
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行后,没问题
在这里插入图片描述
但是,此时若删除系统中MySample.Class文件,自定义加载器可以加载到它,再次运行呢?

根据以上逻辑推敲,自定义加载器加载,MySample.Class
APPClassLoader加载MyCat.class
但是,当MyCat代码中,使用MySample的时候,却没有在此APPClassLoader中找到被加载的MySample,所以,APPClassLoader会去加载MySample.Class,结果肯定加载不到
输出结果:

在这里插入图片描述
这两个类是由不同的命名空间的类加载器,
在这里插入图片描述
红字中表示:由子加载器加载的类,能够找到父加载器加载的类,但是,父加载器加载的类却看不到子加载器加载的类,所以上述代码会报错

再改造代码:
在这里插入图片描述
在这里插入图片描述
同样删除系统中MySample.Class,但是自定义加载器可以加载它
输出结果:
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43277087/article/details/102736081