概述
jdk 自带有三个类加载器:
BootstrapClassLoader、ExtClassLoader、AppClassLoader。
- BootstrapClassLoader (启动类加载器)是 ExtClassLoader
的父类加载器(并不是直接的一个继承关系,通过ExtClassLoader 里面有一个parent属性,这个属性是BootstrapClassLoader),负责加载%JAVV_HOME%/lib/文件下的jar 包 和class文件,java核心类库,无法被java程序直接引用。 - ExtClassLoader(扩展类加载器) 是AppClassLoader 的父类加载器,负责加载%JAVV_HOME%/lib/文件下的jar
包 和class 类。 - AppClassLoader(默认的系统类加载器、线程上下文加载器) 是自定义加载类的父类,负责加载classpath 下的类文件(程序员自己写的代码以及引入的jar 包)。
AppClassLoader 负责加载程序员自己写的代码以及 引入的jar 包
双亲委派模型
向上委派(查找缓存),向下查找(加载路径)
AppClassLoader 在加载一个类的时候,不会直接拿着这个类去加载,他首先会向上委派,实际上就是去查找缓存,每一个类加载类都有各自的缓存,他们会把自己加载过的类放在自己的缓存里面。然后AppClassLoader 加载的时候从AppClassLoader 开始,因为程序启动的时候是从我们的main 方法开始启动,main 方法是由我们的 AppClassLoader 进行加载的,开始的时候遇到一个类的时候不是说直接去加载,先去向上委派(实际上就是去查找缓存),首先找自己的缓存有没有加载,如果没有,会向上查找直到。如果在缓存中找到了,就不用加载了,说明他已经加载了,直接返回就可以了。如果找到最上层还是没有找到,这个时候会去自己的加载路径进行查找(向下查找),如果有这个类,直接加载返回,如果这个类没有,向下查找(加载路径),如果一直没找到,会报找不到这个类。
向上查找,查找到最顶层的加载器为止,向下委派,委派到发起加载的加载器为止。
双亲委派模型的好处:
- 为了安全性,避免用户自己编写的类动态替换java 的一些核心类,比如String。
- 同时也避免了类的重复加载,因为jvm 中区分不同类,不仅仅是根据类名,相同的class 文件被不同的ClassLoader 加载就是不同的两个类。
注意:在JAVA 中,所有以java .开头的类都不会去加载。
最后
以上就是自觉雨为你收集整理的java 类加载器有哪些的全部内容,希望文章能够帮你解决java 类加载器有哪些所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复