一、ClassLoader类加载器:
1.类加载:通过一个类的全名称来获取此类的二进制字节流
2.类加载器:实现类加载功能的代码模块
3.相关方法:
- getClassLoader():获取这个类的类加载器
- getClassLoader().getParent():获取这个类的父加载器
二、JDK内置的三大类加载器:
1.BootStrap(启动类加载器):
- 使用C++语言实现,是JVM自身的一部分,独立于JVM外部,并且无法被Java程序直接引用
- 负责将存放于JAVA_HOME\lib目录下的能被JVM识别的所有类库加载到JVM中(rt.jar->java基础类库)
2.ExtClassLoader(扩展类加载器):
- 使用Java语言实现,可以被Java程序直接引用
- 负责将存放于JAVA_HOME\lib\ext(xml文件解析类,界面框架类)目录下的所有能被JVM识别的类库
3.AppClassLoader(应用程序类加载器):
- 使用Java程序实现,如果用户没有自定义类加载器,则是程序中默认的类加载器
- 负责加载用户classPath上指定的类库
三、类加载器的双亲委派模型:
1.定义:四种类加载器的层次关系称为类加载器的双亲委派模型
2.工作流程:
如果一个类加载器收到了类加载请求,首先自己不会去尝试加载此类,而是将类加载请求委托给父类加载器完成,每一层的类加载器都是如此。只有当父加载器无法加载此类时,子类加载器才会尝试自己去加载。
3.存在意义:保证Java程序的稳定运行
4.比较两个类相等的前提:必须是同一个类加载器加载的前提下才有意义。否则,即使两个类来源于同一个Class文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那么这两个类不相等。