目录
应用程序类加载器 (系统类加载器) AppClassLoader
引导/启动类加载器 Bootstrap ClassLoader
一般来说java有着三层类加载器、双亲委派的类加载架构,今天我们来介绍一下是哪三层类加载器。
我们自定义一个类,然后通过类。class.getClassLoader查看我们自定类的类加载器,可以发现结果是AppClassLoader,然后我们查看系统类加载器结果也是AppClassLoader。这就是我们介绍的一个类加载器。
应用程序类加载器 (系统类加载器) AppClassLoader
① java语言编写
② 父类加载器为扩展类加载器
③ 负责加载环境变量classpanth或系统属性;java.class.path 指定路径下的类库
④ 该类加载器是程序中默认的类加载器,一般来说,java应用的类都是由它来完成的加载
⑤ 通过ClassLoader的getSystemClassLoader()可以获得该类加载器
然后我们获取系统类加载器的父类,就得到了Extension ClassLoader
扩展类加载器 Extension ClassLoader
① java语言编写获取
② 父类加载器为启动类加载器
③ 派生于ClassLoader类
那我们我们能获取到Extension ClassLoader的父类加载器吗,大家可以试一下,应该是获取不到的,这是因为他的父类加载器是Bootstrap ClassLoader,而他是由C++编写的。
引导/启动类加载器 Bootstrap ClassLoader
① C++语言实现,嵌套在JVM内部
② 用来加载Java核心库
③ 加载扩展类和应用程序类加载器,并指定为他们的父类加载器
④ 并不继承自java.lang.ClassLoader;没有父加载器
⑤ 处于安全考虑,Bootstrap启动类加载器值加载包名为java,javax,sun等开头的类
双亲委派模型
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。
就比如我们上面自定义的类,他首先进入AppClassLoader,AppClassLoader有父类加载器,所以委派给他的父类加载器ExtClassLoader,ExtClassLoader也有自己的父类加载器,所以再委派给他的父类加载器Bootstrap ClassLoader,到了Bootstrap ClassLoader就不再向上委派了,Bootstrap ClassLoader查看类,发现不是自己管辖加载的范围,于是再向下委派,委派给到ExtClassLoader,ExtClassLoader查看类,也不是自己管辖加载的类,于是再次向下委派给到AppClassLoader,AppClassLoader查看类,发现是用户自定义的类,是自己需要加载的,于是加载自定义类。
好了,这次的文章就到这里,喜欢的同学可以点赞收藏,遇到问题,可以评论,或者留言,我一定会第一时间给到回馈,感谢观看!!
注:本文为本人学习时心得分享,有讲错或者需要改正的地方,请指正,我会虚心接受