类加载和双亲委派模型

双亲委派机制

类加载器分类

站在Java虚拟机的角度来看,只存在两种不同的类加载器:

  • 一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分;
  • 另外一种是其他所有的类加载器,这些类加载器都是由Java语言实现,独立存在于虚拟机外部,并且全部继承自抽象类java.lang.ClassLoader。

站在开发人员的角度来看,分为四层类加载器:

  • 启动类加载器(Bootstrap Class Loader)
  • 扩展类加载器(Extension Class Loader)
  • 应用程序类加载器(Application Class Loader)
  • 自定义类加载器(User Class Loader)

在这里插入图片描述

前面三种都是JDK自带的类加载器,而自定义类加载器需要开发者自己去实现,

具体各类加载器有啥作用可以参考之前的文章:jvm中自带的类加载器

双亲委派模型

双亲委派模型的工作过程是

  1. 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成;
  2. 如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终到达顶层的启动类加载器;
  3. 如果父类加载器可以完成加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子类加载器才会尝试自己去加载。

在这里插入图片描述

双亲委派模型的作用

  1. 使用双亲委派模型来组织类加载器之间的关系,Java类随着它的类加载器一起具备了一种带有优先级的层级关系。
  2. 避免类的重复加载,当父类加载器已经加载了该类时,子类加载器就没必要再加载一次。
  3. 解决各个类加载器的基础类的统一问题,越基础的类由越上层的加载器进行加载。避免Java核心API中的类被随意替换,规避风险,防止核心API库被随意篡改。

例如类java.lang.Object,它存在在rt.jar中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的Bootstrap ClassLoader进行加载,因此Object类在程序的各种类加载器环境中都是同一个类。相反,如果没有双亲委派模型而是由各个类加载器自行加载的话,如果用户编写了一个java.lang.Object的同名类并放在ClassPath中,那系统中将会出现多个不同的Object类,程序将混乱。因此,如果开发者尝试编写一个与rt.jar类库中重名的Java类,可以正常编译,但是永远无法被加载运行。

参考书籍:深入理解Java虚拟机 第3版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值