双亲委派模型

前言

首先,四种类加载器的关系如图所示

在这里插入图片描述

  • 启动类加载器:加载lib下或被Xbootclasspath参数指定的路径下存入的可识别的类库加载到虚拟机内存中
  • 扩展类加载器:加载lib/ext下的或Java.ext.dirs系统变量所指定的路径中的所有类库
  • 应用程序类加载器:负责加载用户类路径上定义的所有类库
  • 自定义类加载器:顾名思义是自定义的扩展类加载器

双亲委派模型

主要思想:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。

双亲委派模型的实现代码很简单,全部集中在java.lang.ClassLoader的loadClass()方法中

protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{
// 首先,检查请求的类是否已经被加载过了
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// 如果父类加载器抛出ClassNotFoundException
// 说明父类加载器无法完成加载请求
}
if (c == null) {
// 在父类加载器无法加载时
// 再调用本身的findClass方法来进行类加载
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}

上面的代码过程—
先检查请求加载的类型是否已经被加载过,若没有则调用父加载器的
loadClass()方法,若父加载器为空则默认使用启动类加载器作为父加载器。假如父类加载器加载失败,抛出ClassNotFoundException异常的话,才调用自己的findClass()方法尝试进行加载。

双亲委派模型的使用,最大的好处在于使java程序可以稳定的运行,比如说使用java.lang.Object类时,最终都会使用父类启动类加载器加载,lib下类包,保证使用的都是同一个Object类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值