简而言之,向上判断是否加载过,向下判断是否可以加载
当加载某类时(1、new一个类;2、调用Class.forName / ClassLoader.loadClass),先看当前类加载器(AppClassLoader)是否加载过,如果未加载过,委托给父加载器(ExtClassLoader),如果它也未加载过,继续委托给其父加载器(BootStrapClassLoader)
如果都未加载过,开始向下判断是否可以加载,BootStrapClassLoader > ExtClassLoader > AppClassLoader,但凡有可以加载的,即直接加载该类,若都无法加载,则抛出异常:ClassNotFoundException
图片来源:https://blog.csdn.net/codeyanbao/article/details/82875064
补充知识点:
Bootstrap classLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。
ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar。
AppClassLoader:主要负责加载应用程序的主函数类