前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >类加载器

类加载器

原创
作者头像
Get
发布2024-03-25 22:19:47
660
发布2024-03-25 22:19:47
代码语言:java
复制
名称 			            加载哪的类 			说明
Bootstrap(引导类加载器) 		ClassLoader 	 JAVA_HOME/lib,无法直接访问(平台相关的底层C/C++语言实现, 所以该加载器不能被Java代码访问到)
                                              如:java.lang.String,java.lang.Object,java.lang*...   {JRE_HOME}/lib/rt.jar
Extension(拓展类加载器) 		ClassLoader 	 JAVA_HOME/lib/ext 上级为 Bootstrap,显示为 null
                                              整个JVM加载器的Java代码可以访问到的类加载器的最顶端  
Application(应用类加载器)   	ClassLoader		 classpath 上级为 Extension
                                              用于加载用户代码,是用户代码的入口,称其为 初始类(Initial Class),如 HelloWorld.Class
Customized(自定义类加载器) 	自定义 			 上级为 Application
                                              用户可以自己定义类加载器来加载类。所有的类加载器都要继承java.lang.ClassLoader类。              

加载器.jpg
加载器.jpg
代码语言:java
复制
逻辑是从自定义加载器一直往上父类加载器递归调用,直到扩展类加载器发现没有parent了,就会去查看引导类加载器加没加载过该类。
加载顺序应该是先查看引导类加载器是否加载,再由父类加载器尝试加载,最后是子类加载器自己加载。
双亲委派:
向上委派过程:
第一步: 将自定义加载器挂载到应用程序类加载器;
第二步: 应用程序类加载器将请求委托给扩展类加载器;
第三步: 扩展类加载器将请求委托给启动类加载器。
向下委派的加载过程(报ClassNotFund的过程):
第一步: 启动类加载器在加载路径下查找并加载Class文件,如果没有找到就交给扩展类加载器加载 
第二步:扩展类加载器在它的加载路径下查找并加载Class文件,如果还是没有找到,再交给应用程序类加载器加载 
第三步:应用程序类加载器在加载路径下查找并加载Class文件,如果还是没有找到,就交给自定义加载器进行加载 
第四步:自定义加载器在用户指定的位置进行查找并加载Class文件,如果还是没有找到,JVM抛出ClassNotFund异常,这时类加载失败,JVM也启动失败。
PS: 父加载器不是父类!不是继承!而是组合关系,代码里是通过定义一个parent属性,来达到拥有父加载器的效果。
白话文:加载一个类的时候首先通过customer的缓存去找,没有找到,就去app的缓存中找,也没找到就去exdention的缓存找,如果还没有就去bootstrap去找。
       如果最后还没有,就会去委托bootstrap去加载,不在负责范围内,再去委托extension加载,不在负责范围内,再去委托app去加载,不在负责范围内,
       再去委托customer加载,最后如果还不能加载,抛出异常classNotFountException

clipboard.png
clipboard.png

双亲委派加载:主要是为了安全

代码语言:java
复制
向上委派机制:保证先加载JDK的核心类,再加载应用程序的类,有效防止了因为应用程序中因为某个类的存在一些不安全问题,导致JVM变得不安全。
向下委派机制:保证需要加载的类,都得到了加载。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档