ClassLoad类加载器与双亲委派模型
1. 类加载器
Class类描述的是整个类的信息,在Class类中提供的方法getName()是根据ClassPath配置的路径来进行类加载的。若类加载的路径为文件、网络等时则必须进行类加载这是就需要用到ClassLoader类。
ClassPath:加载类的路径。
(1)ClassLoad:
类加载器用来加载 Java类到Java 虚拟机中。Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成Java字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。
观察类加载器的存在性:
//自定义类,也在ClassPath路径下
class Message{}
public class Test2{
public static void main(String[] args) throws Exception {
Class<?> class1 = Class.forName("reflect.Message");
System.out.println(class1.getClassLoader());
System.out.println(class1.getClassLoader().getParent());
System.out.println(class1.getClassLoader().getParent().getParent());
}
}
通过上述程序结果我们可以看到两类类加载器:AppClassLoader、ExtClassLoad;实则jdk默认提供如下几种类加载器:
A. BootStrap:
也称为启动类加载器或核心类加载器。由C++实现,是JVM虚拟机的一部分。
除BootStrap外其他类加载器是由Java语言实现,独立于JVM并且继承与iava.lang.ClassLoader。
主要负责加载JAVA_HOME/lib(典例:rt.jar)
bootStrap类加载器不能直接被程序使用。
B. ExtClassLoader:
扩展类加载器,主要加载JAVA_HOME/lib/ext
有Java语言实现可以被Java程序直接使用。
C. AppClassLoader:
应用程序类加载器,主要负责用户类路径(ClassPath)配置下的类库。若用户为自定义类加载器则默认使用AppClassLoader。
以上三种类加载器加载的代码都必须要求在CLASSPATH中加载。
类加载器带来的好处:
可以通过动态的路径进行类的加载操作。
(1)自定义类加载器
用户决定类从哪里加载。
ClassLoad类中提供进行类加载的方法:
protected Class<?> loadClass(String name, boolean resolve)
比较两个类相等的前提:
必须是由同一个类加载器加载的前提下才有意义。否则,即使两个类来源于同一个Class 文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那么这两个类注定相等。
2. 类加载器的双亲委派模型
(1)双亲委派模型定义
四中类加载器的层次关系就称为双亲委派模型。
(2)双亲委派模型中除了BootStrap外,其他类加载器都有自己的父类加载器。
(3)工作流程:
当一个类加载器收到加载类请求时,先不自己处理而是把加载请求委托给父加载器处理,只有当所有父加载器无法加载此类时子类才尝试自己加载。
好处:保证Java程序的稳定执行。
(4)双亲委派模型从jdk1.2之后引入,但它不强制约束,甚至可以破坏双亲委派模型来进行类加载(典型:OSGI技术:Java模块化技术)。
(5)双亲委派模型可保证Java程序的稳定执行(如:自定义java。Lang包下的Object类,类加载器始终都不会对自定义的进行加载)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了