欢迎光临散文网 会员登陆 & 注册

[JAVA面试]-谈谈你对双亲委派机制的了解

2023-04-15 09:24 作者:老姚撸码  | 我要投稿

在介绍双亲委派机制前,先来看下类加载器的层次关系图,如下:


  • 启动类加载器(Bootstrap ClassLoader),负责加载存放在$JAVA_HOME\jre\lib下,或被-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库(如rt.jar,所有的java.*开头的类均被Bootstrap ClassLoader加载)。启动类加载器是无法被Java程序直接引用的。

  • 扩展类加载器(Extension ClassLoader),该加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载$JAVA_HOME\jre\lib\ext目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.*开头的类),开发者可以直接使用扩展类加载器。

  • 应用程序类加载器(Application ClassLoader),该类加载器由sun.misc.Launcher$AppClassLoader来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

  • 自定义类加载器(User ClassLoader),如果有必要,我们还可以加入自定义的类加载器。因为JVM自带的ClassLoader只是懂得从本地文件系统加载标准的java class文件。

双亲委派机制是指如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。

为了更清楚的了解双亲委派机制,我们来看下jdk1.8源码java.lang.ClassLoader.loadClass()方法实现:

    

上面代码注释写的很清楚,首先调用findLoadedClass方法检查是否已加载过这个类,如果没有就调用parent的loadClass方法,从底层一级级往上。如果所有ClassLoader都没有加载过这个类,就调用findClass方法查找这个类,然后又从顶层逐级向下调用findClass方法,最终都没找到就抛出ClassNotFoundException。这样设计的目的是保证安全性,防止系统类被伪造。

为了便于理解,以下是加载逻辑示意图:

本文章对应的视频讲解   https://www.bilibili.com/video/BV1UX4y1r7mA/



[JAVA面试]-谈谈你对双亲委派机制的了解的评论 (共 条)

分享到微博请遵守国家法律