来自知乎的双亲委派讲解,简单记录下:
1.java类加载器类型:
- 启动类加载器:负责加载 java_home/lib 目录中的类库
- 扩展类加载器:负责加载 java_home/lib/ext 目录中的类库
- 应用程序类加载器:负责加载用户路径(classpath)上的类库
除了上述3种类加载器,我们也可以通过继承 java.lang.ClassLoader
实现自定义的类加载器
这些类加载器的关系如下:
既然有这么多的类加载器,加载一个类时使用哪个类加载器呢?如果不同的类加载器里有同名的类,以哪个类为准,如何避免类名冲突?双亲委派机制就是为了解决这些问题。
双亲委派机制是指一个类在收到类加载请求后不会尝试自己加载这个类,而是把该类加载请求向上委派给其父类加载器去完成,其父类加载器在接收到该类加载请求后又会将其委派给自己的父类,以此类推,这样所有的类加载请求都被向上委派到启动类加载器中。若父类加载器在接收到类加载请求后发现自己也无法加载该类(通常原因是该类的Class文件在父类的类加载路径中不存在),则父类会将该信息反馈给子类并向下委派子类加载器加载该类,直到该类被成功加载,若找不到该类,则JVM会抛出ClassNotFoud异常。
加载流程如下:
知识扩展: