双亲委派机制及使用原因是什么?

TheDisguiser 2020-05-10 17:35:27 java常见问答 13157

双亲委派机制大家知道是什么吗?相信都挺耳熟吧,今天我们就来了解一下到底什么是双亲委派机制及它的使用原因吧。

一、什么是双亲委派机制?

当某个特定的类加载器它在接到需要加载类的请求时,这个类会首先查看自己已加载完的类中是否包含这个类,如果有就返回,没有的话就会把加载的任务交给父类加载器加载,以此递归,父类加载器如果可以完成类加载任务,就返回它,当父类加载器无法完成这个加载任务时,才会不得已自己去加载。这种机制就叫做双亲委派机制。

双亲委派机制及使用原因

工作机制

类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件。在Java中,类装载器把一个类装入JVM中,要经过以下步骤:

1) 装载:查找和导入Class文件;

2) 链接:把类的二进制数据合并到JRE中;

(a)校验:检查载入Class文件数据的正确性;

(b)准备:给类的静态变量分配存储空间;

(c)解析:将符号引用转成直接引用;

3) 初始化:对类的静态变量,静态代码块执行初始化操作

双亲委派机制及使用原因

类加载器与双亲委派模型

类加载器

1) Bootstrap ClassLoader : 将存放于lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar 名字不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被Java程序直接引用

2) Extension ClassLoader : 将libext目录下的,或者被java.ext.dirs系统变量所指定的路径中的所有类库加载。开发者可以直接使用扩展类加载器。

3) Application ClassLoader : 负责加载用户类路径(ClassPath)上所指定的类库,开发者可直接使用。

双亲委派模型

双亲委派机制及使用原因

工作过程:类加载器接收类加载的请求,先把请求委托给父类加载器去完成,所有层次的类加载器都是如此,因此所有的加载请求都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。

反射

Reflection机制允许程序在正在执行的过程中,利用Reflection APIs获取任何已知名称的类的内部信息,并能够在执行过程中,动态生成instances、变更fields内容或唤起methods。

二、为什么要使用双亲委派机制?

java虚拟机只会在不同的类的类名相同且加载该类的加载器均相同的情况下才会判定这是一个类。如果没有双亲委派机制,同一个类可能就会被多个类加载器加载,如此类就可能会被识别为两个不同的类,相互赋值时问题就会出现。

双亲委派机制能够保证多加载器加载某个类时,最终都是由一个加载器加载,确保最终加载结果相同。

没有双亲委派模型,让所有类加载器自行加载的话,假如用户自己编写了一个称为java.lang.Object的类,并放在程序的ClassPath中,系统就会出现多个不同的Object类, Java类型体系中基础行为就无法保证,应用程序就会变得一片混乱。

以上就是本文的全部内容了,想知道更多java常见问答的相关内容就请关注我们的网站吧。

推荐阅读:

双亲委派机制可以被打破吗?模型可以被破坏吗?

双亲委派机制好处是什么?有什么好处?