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,但是自定义加载器可以加载它
输出结果: