解读:
加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。
比如我们的 Math 类, 先会找应用程序类加载器加载,应用程序类加载器会先委托扩展类加载器加载,扩展类加载器再委托引导类加载器,顶层引导类加载器在自己的类加载路径里找了半天没找到 Math 类,则向下退回加载 Math 类的请求,扩展类加载器收到回复就自己加载,在自己的类加载路径里找了半天也没找到 Math 类,又向下退回 Math 类的加载请求给应用程序类加载器,应用程序类加载器于是在自己的类加载路径里找 Math 类,结果找到了就自己加载了。。
源码解读:
loadClass : —> 首先,检查一下指定名称的类是否已经加载过,如果加载过了,就不需要再加载,直接返回。
如果此类没有加载过,那么,再判断一下是否有父加载器;如果有父加载器,则由父加载器加载(即调用 parent.loadClass (name, false);). 或者是调用 bootstrap 类加载器来加载。
如果父加载器及 bootstrap 类加载器都没有找到指定的类,那么调用当前类加载器的 findClass 方法来完成类加载。
真正的 findClass 方法实现在 RULClassLoader 方法里面
智一面热门岗位面试题:
java实习(基础知识)
java实习(阿里巴巴实习生面经)
高级java开发工程师(微服务/Spring Cloud)
中高级PHP开发工程师(thinkphp/面向对象)
初中级运维工程师(linux/shell)
python数据分析师(数据分析/python)