1. 认识ClassLoader
类加载器:通过一个类的全名称来获取此类的二进制字节流,实现这个操作的代码模块称为类加载器。
public class Test3{
public static void main(String[] args) {
Class<?> cls = Test3.class;
System.out.println(cls.getClassLoader());
//取得父加载器
System.out.println(cls.getClassLoader().getParent());
System.out.println(cls.getClassLoader().getParent().getParent());
System.out.println(cls.getClassLoader().getParent().getParent().getParent());
}
}
1.JDK中内置的三大类加载器
- Bootstarp(启动类加载器):
I. 使用C++实现,是JVM的一部分,其他所有类加载器均使用Java实现。
II.负责将存放于Java_HOME\lib目录下的能被JVM识别的类库(rt.jar-存放了Java所有基础类库,Java.lang,Java.util)加载到JVM中。
III.启动类加载器无法被Java程序直接引用。
- ExtClassLoader(扩展类加载器):
I.使用Javashi实现,并且可以被Java程序直接引用。
II.加载加载Java_HOME\lib\ext目录下能被识别的类库。
- AppClassLoader(应用程序类ji加载器):
I.负责加载用户路径(classPath)上指定的类库。
II.如果应用程序中没有自定义类加载器,则此加载器就是Java程序中默认的类加载器。
2. 类加载器双亲委派模型
定义:JDK内置的三种类加载器与用户自定义类加载器之间的层次关系称为类加载器的双亲委派模型。要求除了顶层的父类加载器外,其余的类加载器都应有自己的父类加载器。
执行流程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载此类,而是把类加载请求委托给父类加载器完成,每一个层次类加载器均是如此。只有当父类加载器无法完成加载请求时(在自己搜索范围类没有找到此类),子加载器才会尝试自己去加载。
双亲委派模型保证Java程序稳定运行。Java中基础类库一定由顶层BootStrap类加载器加载,因此,诸如Object等核心类在各种类加载器环境下都是同一个类。
比较两个类相等的前提:这两个类必须是由同一个类加载器加载的前提下才有意义。