了解双亲委派机制前,先了解java的类加载器有哪些,java为我们提供3种类加载器。
1.启动类加载器
作用:负责加载 `JAVA_HOME/lib` 目录中的类库。
2.扩展类加载器
作用:负责加载 `JAVA_HOME/lib/ext` 目录中的类库。
3.应用类加载器
作用:负责加载用户路径(CLASSPATH)上的类库。
除了上述3种加载器,我们也可以自定义类加载器,继承java.lang.Classloader即可
关系如下。
启动类加载器->扩展类加载器->应用类加载器-自定义加载器 从左往右(由父到子)。
图解
选取类加载流程
步骤:
- 自定义加载类挂载到应用程序类加载。
- 应用程序类加载器将类加载请求委托给扩展类加载器。
- 扩展类加载器将类加载请求委托给启动类加载器。
- 启动类加载器在加载路径下查找并加载Class文件,如果未找到目标Class文件,则交由扩展类加载器加载。
- 扩展类加载器在加载路径下查找并加载Class文件,如果未找到目标Class文件,则交由应用程序类加载器加载。
- 应用程序类加载器在加载路径下查找并加载Class文件,如果未找到目标Class文件,则交由自定义加载器加载。
- 在自定义加载器下查找并加载用户指定目录下的Class文件,如果在自定义加载路径下未找到目标Class文件,则抛出ClassNotFoud异常。
解决了什么问题
保证了jvm中类唯一,只被加载一次。