searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

浅谈JAVA双亲委派

2023-09-01 09:35:48
3
0

在提到JAVA的类加载时,我们经常会听到“双亲委派”,那“双亲委派”到底是指什么,下面我们进行简单的介绍。

 

在介绍双亲委派前,首先我们得知道,JAVA虚拟机中以下3个类加载器的功能:

  • 启动类加载器:

启动类加载器(Bootstrap ClassLoader)是由 C++ 实现的,它是用来加载 java核心类库,例如\jre\lib\rt.jar 和 resources.jar 等 jar 包

  • 扩展类加载器:

扩展类加载器(Extension ClassLoader)是用来加载一些扩展的jar报,具体为 \jre\lib\ext 目录下 jar 包的

  • 应用程序类加载器:

应用程序类加载器(Application ClassLoader)是用来加载 classpath 也就是用户的所有类

 

在了解到以上几个类加载器的功能后,我们再看下java虚拟机中,一个类要被加载时,对应到这3个类加载器中是一个怎样的流程

一个类要加载时,先要判断是否已经加载过,参考上图中的实线箭头流程:

1、首先进入到应用程序类加载器检查是否已经加载过,如果已加载则结束,如果未加载,则进入到扩展类加载器中

2、扩展类加载器中继续判断是否已加载过该类,如果已加载则结束,如果未加载,则进入到启动类加载器中

3、同理,启动类加载器中继续判断是否已加载过该类,如果已加载则结束,如果未加载,则进入类加载流程

从上述流程可知,类是否已加载过判断是由下到上的判断流程,那在类加载时,是由上倒下相反的流程:

1、先从启动类加载器判断是否可以加载该类,如果可以加载,则加载结束流程,如果不能加载,则进入到扩展类加载器中

2、扩展类加载器继续判断是否可以加载该类,如果可以加载,则加载结束流程,如果不能加载,则进入到应用程序类加载器中

3、同理,应用程序类加载器继续判断是否可以加载该类,如果可以加载,则加载结束流程,如果不能加载,则抛出classNotFound异常

以上的类加载,其实也就是我们熟说的双亲委派规则,简述到一句话就是,类加载时的查找是从下到上,也就是从子到父的查找,而类的加载是从上到下,也就是从父到子的加载。

 

那这么设计的好处是什么呢?

我们知道,java有很多系统类,那么当有人想要篡改系统类库时,该机制能有效的防止该操作。为什么能防止呢,从上述我们描述的类加载流程可知,一个类的加载是按照启动类加载器->扩展类加载器->应用程序类加载器进行加载的,那如果有用户自定义了一个系统类(想篡改),但是在启动类加载器时,系统已经判断在系统库中加载到了该系统类,则流程就阻断了,不会再到应用程序类加载器中加载用户自定义的系统类,从而防止了篡改危险。

 

从上可知,双亲委派是 Java 中多个类加载器(启动类加载器、扩展加载器、应用程序类加载器)的运行规则,通过这个规则可以有效的避免类的安全问题和重复加载的问题

0条评论
0 / 1000
p****n
2文章数
0粉丝数
p****n
2 文章 | 0 粉丝
p****n
2文章数
0粉丝数
p****n
2 文章 | 0 粉丝
原创

浅谈JAVA双亲委派

2023-09-01 09:35:48
3
0

在提到JAVA的类加载时,我们经常会听到“双亲委派”,那“双亲委派”到底是指什么,下面我们进行简单的介绍。

 

在介绍双亲委派前,首先我们得知道,JAVA虚拟机中以下3个类加载器的功能:

  • 启动类加载器:

启动类加载器(Bootstrap ClassLoader)是由 C++ 实现的,它是用来加载 java核心类库,例如\jre\lib\rt.jar 和 resources.jar 等 jar 包

  • 扩展类加载器:

扩展类加载器(Extension ClassLoader)是用来加载一些扩展的jar报,具体为 \jre\lib\ext 目录下 jar 包的

  • 应用程序类加载器:

应用程序类加载器(Application ClassLoader)是用来加载 classpath 也就是用户的所有类

 

在了解到以上几个类加载器的功能后,我们再看下java虚拟机中,一个类要被加载时,对应到这3个类加载器中是一个怎样的流程

一个类要加载时,先要判断是否已经加载过,参考上图中的实线箭头流程:

1、首先进入到应用程序类加载器检查是否已经加载过,如果已加载则结束,如果未加载,则进入到扩展类加载器中

2、扩展类加载器中继续判断是否已加载过该类,如果已加载则结束,如果未加载,则进入到启动类加载器中

3、同理,启动类加载器中继续判断是否已加载过该类,如果已加载则结束,如果未加载,则进入类加载流程

从上述流程可知,类是否已加载过判断是由下到上的判断流程,那在类加载时,是由上倒下相反的流程:

1、先从启动类加载器判断是否可以加载该类,如果可以加载,则加载结束流程,如果不能加载,则进入到扩展类加载器中

2、扩展类加载器继续判断是否可以加载该类,如果可以加载,则加载结束流程,如果不能加载,则进入到应用程序类加载器中

3、同理,应用程序类加载器继续判断是否可以加载该类,如果可以加载,则加载结束流程,如果不能加载,则抛出classNotFound异常

以上的类加载,其实也就是我们熟说的双亲委派规则,简述到一句话就是,类加载时的查找是从下到上,也就是从子到父的查找,而类的加载是从上到下,也就是从父到子的加载。

 

那这么设计的好处是什么呢?

我们知道,java有很多系统类,那么当有人想要篡改系统类库时,该机制能有效的防止该操作。为什么能防止呢,从上述我们描述的类加载流程可知,一个类的加载是按照启动类加载器->扩展类加载器->应用程序类加载器进行加载的,那如果有用户自定义了一个系统类(想篡改),但是在启动类加载器时,系统已经判断在系统库中加载到了该系统类,则流程就阻断了,不会再到应用程序类加载器中加载用户自定义的系统类,从而防止了篡改危险。

 

从上可知,双亲委派是 Java 中多个类加载器(启动类加载器、扩展加载器、应用程序类加载器)的运行规则,通过这个规则可以有效的避免类的安全问题和重复加载的问题

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0