Java类加载器定义
Java类加载器(Class Loader)是Java虚拟机的一部分,负责加载类文件并将其转换为运行时的Java类。
如下图所示:
Java程序被编译器编译之后,成为字节码文件class文件。
当程序需要某个类时,虚拟机便会将对应的class文件进行加载,创建出对应的Class对象。
而这个将class文件加载到虚拟机内存的过程,便是类加载。
Java类加载器作用
Java类加载器的主要作用是将Java类加载到内存中,以便在程序运行时使用。
Java类加载器是Java虚拟机的一部分,负责查找、加载、链接和初始化类文件。
Java类加载过程
Java类加载机制过程主要会包含:加载、验证、准备、解析、和初始化的过程。
如下图所示:
Java类加载过程分为三个主要阶段:加载、链接和初始化。
1.加载(Loading)
加载阶段是类加载过程的第一步,在加载阶段,类加载器负责查找并读取类文件的字节码数据,通常从文件系统、网络资源或其他来源获取。
加载阶段不涉及类的验证和初始化,只是将类的字节码加载到内存中,形成一个类的表示,通常称为”类对象”。
2.链接(Linking)
链接阶段是类加载过程的第二步,可以进一步分为三个子阶段:验证、准备和解析。
3. 验证(Verification):
- 在验证阶段,虚拟机对加载的类进行各种检查,以确保它的字节码是有效、安全的,不会破坏虚拟机的安全性和稳定性。
- 这包括检查字节码的格式、语义和一致性,以防止潜在的安全漏洞。
4. 准备(Preparation):
- 在准备阶段,虚拟机为类的静态字段分配内存并设置默认值。
- 这包括对类变量(静态字段)进行内存分配,并为它们赋予默认值(通常为零值,如0、null等)。
5. 解析(Resolution):
在解析阶段,虚拟机将符号引用转化为直接引用,以便在运行时快速访问类、字段和方法。
这个过程包括查找类、方法和字段的引用,将其映射到具体的内存地址或句柄,以便后续运行时使用。
6.初始化(Initialization):
初始化阶段是类加载过程的最后一步。
在初始化阶段,虚拟机执行类的初始化代码,包括执行静态字段的初始化赋值和执行静态初始化块(<clinit>
)。
初始化代码会按照代码中的顺序执行,确保静态字段被正确初始化。
初始化是类加载过程的最后一个步骤,它标志着类已经准备好在程序中使用。
Java类加载器原理
Java中的类加载器采用了双亲委派模型,即所有类都由父类加载器加载,除非显式地指定使用某个特定的类加载器。
如下图所示:
双亲委派模型
Java类加载器采用了双亲委派模型,在这个模型中,有多个类加载器按层次结构组织,包括根加载器、扩展类加载器、系统类加载器和用户自定义加载器。
类加载器遵循双亲委派模型,即当加载类的请求到来时,它首先将加载请求委派给父加载器。
只有在父加载器无法加载该类时,它才尝试加载该类,这样的模型可以确保类的一致性和安全性,避免类的重复加载。
类加载器层次结构
Java类加载器形成了一个层次结构,其中每个类加载器都有一个父加载器,直到根加载器。
根加载器负责加载Java核心类库,扩展类加载器负责加载扩展类库,系统类加载器负责加载应用程序类,用户可以创建自定义类加载器来扩展这个层次结构。
自定义类加载器
Java允许开发者创建自定义类加载器,以满足特定需求。
自定义类加载器可以继承系统类加载器,覆盖加载类的行为,实现类的动态加载、热部署、安全性控制等功能。
Java类加载总结
总的来说,Java类加载器是Java应用程序的关键组成部分,负责加载类文件并创建运行时的Java类,双亲委派模型和类加载器层次结构保证了类的安全性和一致性。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》