名称 加载哪的类 说明
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类。
逻辑是从自定义加载器一直往上父类加载器递归调用,直到扩展类加载器发现没有parent了,就会去查看引导类加载器加没加载过该类。
加载顺序应该是先查看引导类加载器是否加载,再由父类加载器尝试加载,最后是子类加载器自己加载。
双亲委派:
向上委派过程:
第一步: 将自定义加载器挂载到应用程序类加载器;
第二步: 应用程序类加载器将请求委托给扩展类加载器;
第三步: 扩展类加载器将请求委托给启动类加载器。
向下委派的加载过程(报ClassNotFund的过程):
第一步: 启动类加载器在加载路径下查找并加载Class文件,如果没有找到就交给扩展类加载器加载
第二步:扩展类加载器在它的加载路径下查找并加载Class文件,如果还是没有找到,再交给应用程序类加载器加载
第三步:应用程序类加载器在加载路径下查找并加载Class文件,如果还是没有找到,就交给自定义加载器进行加载
第四步:自定义加载器在用户指定的位置进行查找并加载Class文件,如果还是没有找到,JVM抛出ClassNotFund异常,这时类加载失败,JVM也启动失败。
PS: 父加载器不是父类!不是继承!而是组合关系,代码里是通过定义一个parent属性,来达到拥有父加载器的效果。
白话文:加载一个类的时候首先通过customer的缓存去找,没有找到,就去app的缓存中找,也没找到就去exdention的缓存找,如果还没有就去bootstrap去找。
如果最后还没有,就会去委托bootstrap去加载,不在负责范围内,再去委托extension加载,不在负责范围内,再去委托app去加载,不在负责范围内,
再去委托customer加载,最后如果还不能加载,抛出异常classNotFountException
双亲委派加载:主要是为了安全
向上委派机制:保证先加载JDK的核心类,再加载应用程序的类,有效防止了因为应用程序中因为某个类的存在一些不安全问题,导致JVM变得不安全。
向下委派机制:保证需要加载的类,都得到了加载。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。