双亲委派模型的作用:
避免类的重复加载(相同的类文件被不同的类加载器加载产生的是不同的类)。??也保证了 Java 的核心 API 不被篡改??
如果没有使用双亲委派模型,而是每个类加载器加载自己的话就会出现一些问题,比如我们编写一个称为 java.lang.Object 类的话,那么程序运行的时候,系统就会出现多个不同的 Object 类。
什么是双亲委派模型:
就是一个类加载收到了一个类的加载请求,他不会立即去加载,而是交给他的父类加载器去执行,如果父类加载器还存在其父类加载器,就继续向上委托,最终到达顶层的启动类加载器,加入父类加载器可以完成加载任务,就加载,如果不行的话就交给子类加载器去加载
(即在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则才会尝试加载。加载的时候,首先会把该请求委派该父类加载器的 loadClass() 处理,因此所有的请求最终都应该传送到顶层的启动类加载器 BootstrapClassLoader 中。当父类加载器无法处理时,才由自己来处理。当父类加载器为null时,会使用启动类加载器 BootstrapClassLoader 作为父类加载器)
- BootstrapClassLoader(启动类加载器) :最顶层的加载类,由C++实现,负责加载
%JAVA_HOME%/lib目录下的jar包和类或者或被-Xbootclasspath参数指定的路径中的所有类。 - ExtensionClassLoader(扩展类加载器) :主要负责加载目录
%JRE_HOME%/lib/ext目录下的jar包和类,或被java.ext.dirs系统变量所指定的路径下的jar包。 - AppClassLoader(应用程序类加载器) :面向我们用户的加载器,负责加载当前应用classpath下的所有jar包和类

1040

被折叠的 条评论
为什么被折叠?



