三个类加载器:
Bootstrap ClassLoader(启动类加载器):是其他类加载器的起点
Extension ClassLoader(扩展类加载器):父加载器是Bootstrap ClassLoader
Application ClassLoader(应用程序类加载器):
1.父加载器是Extension ClassLoader
2.我们系统的类加载器和默认的线程上下文类加载器
AppClassLoader中找到需要的缓存则直接返回已加载的类,没找到则查找(向上委派)ExtClassLoader里面的缓存,
ExtClassLoader里面找到则返回已加载的类,没找到则查找(向上委派)BootstrapClassLoader里面的缓存,
BootstrapClassLoader里面找到则返回已加载的类,
没找到就查找BootstrapClassLoader的加载路径,有则返回,
无则向下查找ExtClassLoader的加载路径,有则返回,
无则向下查找AppClassLoader的加载路径,有则返回,
此时还没有则抛出 ClassNotFoundException 异常。这个异常表示类加载器无法找到指定名称的类。
双亲委派即向上委派到顶层加载器,向下查找到发起加载的加载器为止。
在自定义的类加载器中,如果存在缓存并且缓存中已经加载了所请求的类,那么类加载器可以直接从缓存中返回已加载的类,而无需重新加载。