file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(97).pngfile:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(98).png- 已知:
- 根据委托机制,因为B类是在A类中被引用的,如果B类还没有被加载过,就要指定加载A类的类加载器加载B类,也就是指定自定义加载器D加载B类,当自定义加载器D为指定加载器的时候,它并不是直接加载B类,而是让其在类加载器树状结构的父节点的类加载器加载,类似的,父节点加载器也会采取相同的动作,如此迭代,最终会交给BootStrap类加载器尝试加载,如果BootStrap无法加载,那么就会采取和刚才相反的方向迭代,也就是向下迭代,尝试加载,如果直到最开始发起请求的类加载器也就是自定义类加载器D也无法加载,就会抛出 ClassNotFoundException
- 假如经过上面步骤B类最终由AppClassLoader加载,那么在加载C类的时候,指定加载C类的类加载器是最终加载B类的AppClassLoader,还是最先指定加载B类的自定义加载器D呢???
- 个人答案:指定加载C类的类加载器是最终加载B类的AppClassLoader;因为在定义中我们可以知道指定加载C类的类加载器是加载B类的类加载器,而没有提到最先指定的信息;
- 思考:根据让面的过程我们可以得知,如此类之间不断地相互引用,类加载器是不断向根节点靠近的,只要我们不在自定义指定某个类加载器去加载,他是不会再用外围的类加载器的;那么我们应该怎么理解呢???既然B类能够被AppClassLoder加载,那么他内部所引用的所有类都是被AppClassLoder及其以上的类加载器加载的,也就是上面加载器所加载的类是要被下面加载器加载的类所调用的,换句话说也就是上面加载器加载的类不会去调用下面加载器加载的类(除非我们指定);
- 不知道哪里理解的有不对的吗,希望能早点被指定,防止自己走远。。。
|
|