类加载器ClassLoader:
- 启动类加载器: Bootstrap ClassLoader Load classes from JRE/lib/rt.jar 不是用Java代码编写, 程序中获取不到, 因此无法通过ClassLoader获取这个目录下的Resource File
- 扩展类加载器: Extension ClassLoader Load classes from JRE/lib/ext or Djava.ext.dirs Java代码中可以获取的最父级ClassLoader
- 系统类加载器: AppClassLoader Load classes from classPath or Djava.class.path
- 用户类加载器: User-Defined ClassLoader
TIP: 查找类或者查找文件时, 是从一个类加载器A开始找Parent ClassLoader, 一直找到Extension ClassLoader,
然后执行getBootstrapResource(String)方法从BootstrapClassPath加载Resource File, 如果加载到了直接返回,
否则从Extension ClassLoader回溯至A ClassLoader(双亲委派):
-
调用getLookupCache(String)方法找出之前查找过的Loader(ClassPath)的下标
-
调用getNextLoader(int[], int)方法找出下一个需要查找Resource File的Loader(ClassPath),
2.1 如果缓存的Loader(ClassPath)的下标数组为null, 则调用getLoader(int)方法从当前ClassLoader的Stack urls中获取一个URL — 栈.pop(), 这个栈保存的是Loader(ClassPath)的URL, 再通过URL获取其Loader(ClassPath)并返回 — 查找过的就放进缓存: Ar