类加载器和双亲委派机制

在说双亲委派机制之前,一定要先对类加载器有一定的了解。

一、类加载器

在类的加载过程中,需要用到类加载器,类加载器用于实现类的加载动作。对于任意一个类,都会有一个唯一的类加载器去加载。
对于java虚拟机来说,只存在两种类加载器:一是启动类加载器(Bootstrap Class Loader),这个类加载器是使用的C++语言实现的,属于虚拟机的一部分。二是其他所有的类加载器,这些其他的类加载器都是使用java语言实现的,独立于虚拟机之外,并且全部继承了java.lang.ClassLoader这个抽象类。
不过对我们平常所说的类加载器,java虚拟机的划分会更加细一些,自JDK1.2以来,Java使用的一般都是三层类加载器以及双亲委派的机制。类加载器(1.9版本之前)如下图所示(摘自《深入理解Java虚拟机》):
在这里插入图片描述

启动类加载器(Bootstrap Class Loader):负责加载存放在<JAVA_HOME>\lib 目录下的类库,如果虚拟机配置了-Xbootclasspath参数,则加载此参数指定的目录下类库。

扩展类加载器(Extension Class Loader):负责加载<JAVA_HOME>\lib\ext目录下的类库,如果系统环境变量配置了java.ext.dirs参数,则加载此参数指定的目录下类库。jdk9之后被平台类加载器(Platform Class Loader)取代。

应用程序类加载器(Application Class Loader):也被成为系统类加载器,负责加载用户类路径上(ClassPath)的所有的类库,如果没有指定自定义的类加载器,一般我们所写的类都是通过此加载器去加载的。

自定义类加载器:用户自定义的类加载器。

二、双亲委派机制

如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个加载请求委派给父类加载器去完成,每一层的类加载器都是这样,因此所有的类加载请求,都会传到最顶层的启动类加载器中,直到有父类反馈无法完成这个类的加载请求之后(不属于它负责的类加载范围),子加载器才会尝试去加载。
以上图来说明:
一个类加载时,首先根据父类优先原则,依次传递加载请求 :自定义类加载器——应用程序类加载器——扩展类加载器——启动类加载器。然后会从启动类开始加载,如果不能加载,则传递请求到子类加载器:启动类加载器——扩展类加载器——应用程序类加载器——自定义类加载器。当如,如果在父类加载完成,则不会再传递加载请求到子类。

这就是双亲委派机制。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值