每日一题(Classloader)

2019-12-24  本文已影响0人  simperLv
题目:
题目.png 点赞最多的解释.png

去看了下大佬们的博客,深入理解一下工作机制

ClassLoader作用简单概括为
等级加载机制

JVM 运行实例中会存在多个 ClassLoader,不同的 ClassLoader 会从不同的地方加载字节码文件。
JVM 中内置了三个重要的 ClassLoader,分别是 BootstrapClassLoader、ExtensionClassLoader 和 AppClassLoader。

BootstrapClassLoader(启动类加载器): 负责加载 JVM 运行时核心类,这些类位于 JAVA_HOME/lib/rt.jar 文件中,比如 java.util.、java.io.等,BootstrapClassLoader完全是JVM自己控制的,需要加载哪个类,怎么加载都是由JVM自己控制,别人也访问不到这个类,所以BootStrap ClassLoader不遵循委托机制,没有子加载器。

ExtensionClassLoader(扩展类加载器): 负责加载 JVM 扩展类,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar。

AppClassLoader(系统类加载器):直接面向用户的加载器,它会加载 Classpath 环境变量里定义的路径中的 jar 包和目录。我们自己编写的代码以及使用的第三方 jar 包通常都是由它来加载的。可以由ClassLoader.getSystemClassLoader()得到。当我们的 main 方法执行的时候,这第一个用户类的加载器就是 AppClassLoader。

除了引导类加载器之外,所有的类加载器都有一个父类加载器。 给出的 getParent()方法可以得到。对于系统提供的类加载器来说,系统类加载器的父类加载器是扩展类加载器,而扩展类加载器的父类加载器是引导类加载器;对于开发人员编写的类加载器来说,其父类加载器是加载此类加载器 Java 类的类加载器。因为类加载器 Java 类如同其它的 Java 类一样,也是要由类加载器来加载的。一般来说,开发人员编写的类加载器的父类加载器是系统类加载器。类加载器通过这种方式组织起来,形成树状结构。树的根节点就是引导类加载器。

ClassLoader加载类的原理(双亲委托模型)

前面提到 AppClassLoader 只负责加载 Classpath 下面的类库,如果遇到没有加载的系统类库怎么办,AppClassLoader 必须将系统类库的加载工作交给 BootstrapClassLoader 和 ExtensionClassLoader 来做,这就是我们常说的「双亲委派」

image.png
当ClassLoader 在加载一个未知的类名时,是由上至下加载,
AppClassLoader 在加载一个未知的类名时,它并不是立即去搜寻 Classpath,它会首先将这个类名称交给 ExtensionClassLoader 来加载,
而 ExtensionClassLoader 在加载一个未知的类名时,它也并不是立即搜寻 ext 路径,它会首先将类名称交给 BootstrapClassLoader 来加载,
这三个 ClassLoader 之间形成了级联的父子关系,每个 ClassLoader 都很懒,尽量把工作交给父亲做,父亲干不了了自己才会干。每个 ClassLoader 对象内部都会有一个 parent 属性指向它的父加载器。

参考文章:https://blog.csdn.net/u014634338/article/details/81434327
http://blog.itpub.net/31561269/viewspace-2222522/

上一篇 下一篇

猜你喜欢

热点阅读