JAVA中双亲委派机制的原理及其作用

JAVA中双亲委派机制的原理及其作用

什么是双亲委派

当某个类要去加载的时候先去父类里看看这个类有没有被加载过,没有的话再去父类的父类去找,有点类似于递归查找,如果没有的话再自己加载。

有些什么类加载器

BootstrapClassLoader、ExtensionClassLoader、App ClassLoader三种。
1.BootstrapClassLoader是嵌在JVM内核中的加载器,该加载器是用C++语言写的,主要负载加载JAVA_HOME/lib下的类库,启动类加载器无法被应用程序直接使用。ExtensionClassLoader是用JAVA编写,且它的父类加载器是Bootstrap,是由sun.misc.Launcher$ExtClassLoader实现的,主要加载JAVA_HOME/lib/ext目录中的类库。

2.ExtensionClassLoader是用JAVA编写,且它的父类加载器是Bootstrap,是由sun.misc.Launcher E x t C l a s s L o a d e r 实 现 的 , 主 要 加 载 J A V A H O M E / l i b / e x t 目 录 中 的 类 库 。 我 们 知 道 j a v a 中 系 统 属 性 j a v a . e x t . d i r s 指 定 的 目 录 由 E x t C l a s s L o a d e r 加 载 器 加 载 , 如 果 程 序 中 没 有 指 定 该 系 统 属 性 ( − D j a v a . e x t . d i r s = s s s / l i b ) 那 么 该 加 载 器 默 认 加 载 ExtClassLoader实现的,主要加载JAVA_HOME/lib/ext目录中的类库。我们知道java中系统属性java.ext.dirs指定的目录由ExtClassLoader加载器加载,如果程序中没有指定该系统属性(-Djava.ext.dirs=sss/lib)那么该加载器默认加载 ExtClassLoaderJAVAHOME/lib/extjavajava.ext.dirsExtClassLoaderDjava.ext.dirs=sss/libJAVA_HOME/lib/ext目录下的所有jar文件,通过程序来看下系统变量java.ext.dirs所指定的路径

3.App ClassLoader是应用程序类加载器,负责加载应用程序classpath目录下的所有jar和class文件。它的父加载器为Ext ClassLoader

下图为三种类加载的关系

在这里插入图片描述
这里需要注意的是三个类加载器的关系并不是继承关系,而是委派的关系,比如一个类需要加载了,由App ClassLoader委派给ExtensionClassLoader看下有没有被加载过,如果没有再委派给ExtensionClassLoader。

双亲委派流程图

在这里插入图片描述

双亲委派的作用

讲了这么多还是没说重点,为什么要有双亲委派机制呢,最主要作用是什么?
1.为了防止JAVA底层的.class类被恶意篡改,如果你要去重载String类它是不给你加载的,因为通过委派机制检查到已经加载过了。
2.保证同一个类不会被加载两次,原理同上

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值