双亲委派模型

JVM 中内置了三个重要的 ClassLoader,分别是 BootstrapClassLoader、ExtensionClassLoader 和 AppClassLoader。

BootstrapClassLoader 负责加载 JVM 运行时核心类,这些类位于 $JAVA_HOME/lib/rt.jar 文件中,我们常用内置库 java.xxx.* 都在里面,比如 java.util.、java.io.、java.nio.、java.lang.等等。这个 ClassLoader 比较特殊,它是由 C 代码实现的,我们将它称之为「根加载器」。

ExtensionClassLoader 负责加载 JVM 扩展类,比如 swing 系列、内置的 js 引擎、xml 解析器 等等,这些库名通常以 javax 开头,它们的 jar 包位于 $JAVA_HOME/lib/ext/*.jar 中,有很多 jar 包。

AppClassLoader 才是直接面向我们用户的加载器,它会加载 Classpath 环境变量里定义的路径中的 jar 包和目录。我们自己编写的代码以及使用的第三方 jar 包通常都是由它来加载的。

引用自链接:https://www.jianshu.com/p/14f196afeeef

每个对象内部都有一个ClassLoader 来标记自己是被哪个ClassLoader 加载的。在Object类中持有一个Class对象,Class对象持有一个ClassLoader。ClassLoader类似一个容器,持有已经加载的Class对象。

双亲委派:

每个ClassLoader总是先将加载的Class的任务交给自己的爹来做,它的爹又交给它的爹的爹。 ClassLoader并不自己在Classpath加载Class而总是将任务委派给父类,如果父类祖辈都干不了这活,才会调用子类ClassLoader覆写的findClass()来加载。根据自定义ClassLoader不同,双亲可能为三亲、四亲,会一直委派到根类为止。


你可能感兴趣的:(双亲委派模型)