1.认识ClassLoader
先看一段代码:
package 类加载器;
class Test{}
public class getLoader {
public static void main(String[] args) {
Class<?> cls = Test.class;
System.out.println(cls.getClassLoader());
System.out.println(cls.getClassLoader().getParent());
System.out.println(cls.getClassLoader().getParent().getParent());
}
}
结果:
此时会发现结果出现AppClassLoader(应用程序类加载器),PlatformClassLoader(平台类加载器)
那么什么是类加载器,接下来详细介绍一下。
2.类加载器的概念
ClassLoader是Java的类加载器,用于把class文件加载到JVM中。
什么是加载 : 加载就是根据类的全限定名(全限定名 : 包名 + 类名)获取到其定义的二进制字节流,并将其加载到内存中. 此时需要借助类加载器来帮助完成
类加载器分为4类 :
%JAVA_HOME% : 为JDK设置的环境变量路径. 如环境变量里设置了%java_home%=C:\jdk1.8.0
1. Bootstrap Classloader : 启动类加载器,用来加载 %JAVA_HOME%/jre/lib 下的, 如 rt.jar中的class文件 或者 xbootclasspath选项指定的jar包
2. Extension Classloader : 扩展类加载器 , 用来加载 %JAVA_HOME%/jre/ext 中的class文件 或者 -Djava.ext.dirs指定目录下的jar包
3. Application Classloader : 应用类加载器 , 用来加载classpath下的class文件
4. Custom Classloader : 用户自定义类加载器,用来加载自定义内容.此加载器需要用户自己继承Classloader类
3.双亲委派模型
1.什么是双亲委派模型?
第一张图中类加载器之间的层次关系就称为双亲委派模型,双亲委派模型除了顶层的父类加载器外,其他的类加载器都应该有自己的父类加载器。
2.双亲委派模型的工作流程是什么?
工作流程为如果一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是把这 个请求委托给父类加载器去完成,每一个层次的类加载器都是如此。因此,所有的加载请求都应当传送到顶层的 BootStrap加载器中,只有当父加载器反馈无法完成这个加载请求时(在自己搜索范围中没有找到此类),子加载器 才会尝试自己去加载。