Java类加载器详解(定义作用及实现原理)

Java类加载器详解(定义作用及实现原理)-mikechen

Java类加载器定义

Java类加载器(Class Loader)是Java虚拟机的一部分,负责加载类文件并将其转换为运行时的Java类。

如下图所示:

Java类加载器详解(定义作用及实现原理)-mikechen

Java程序被编译器编译之后,成为字节码文件class文件。

当程序需要某个类时,虚拟机便会将对应的class文件进行加载,创建出对应的Class对象。

而这个将class文件加载到虚拟机内存的过程,便是类加载。

 

Java类加载器作用

Java类加载器的主要作用是将Java类加载到内存中,以便在程序运行时使用。

Java类加载器是Java虚拟机的一部分,负责查找、加载、链接和初始化类文件。

 

Java类加载过程

Java类加载机制过程主要会包含:加载、验证、准备、解析、和初始化的过程。

如下图所示:
Java类加载器详解(定义作用及实现原理)-mikechen

Java类加载过程分为三个主要阶段:加载、链接和初始化。

1.加载(Loading)

加载阶段是类加载过程的第一步,在加载阶段,类加载器负责查找并读取类文件的字节码数据,通常从文件系统、网络资源或其他来源获取。

加载阶段不涉及类的验证和初始化,只是将类的字节码加载到内存中,形成一个类的表示,通常称为”类对象”。

2.链接(Linking)

链接阶段是类加载过程的第二步,可以进一步分为三个子阶段:验证、准备和解析。

3. 验证(Verification):

  • 在验证阶段,虚拟机对加载的类进行各种检查,以确保它的字节码是有效、安全的,不会破坏虚拟机的安全性和稳定性。
  • 这包括检查字节码的格式、语义和一致性,以防止潜在的安全漏洞。

4. 准备(Preparation):

  • 在准备阶段,虚拟机为类的静态字段分配内存并设置默认值。
  • 这包括对类变量(静态字段)进行内存分配,并为它们赋予默认值(通常为零值,如0、null等)。

5. 解析(Resolution):

在解析阶段,虚拟机将符号引用转化为直接引用,以便在运行时快速访问类、字段和方法。

这个过程包括查找类、方法和字段的引用,将其映射到具体的内存地址或句柄,以便后续运行时使用。

6.初始化(Initialization):

初始化阶段是类加载过程的最后一步。

在初始化阶段,虚拟机执行类的初始化代码,包括执行静态字段的初始化赋值和执行静态初始化块(<clinit>)。

初始化代码会按照代码中的顺序执行,确保静态字段被正确初始化。

初始化是类加载过程的最后一个步骤,它标志着类已经准备好在程序中使用。

 

Java类加载器原理

Java中的类加载器采用了双亲委派模型,即所有类都由父类加载器加载,除非显式地指定使用某个特定的类加载器。

如下图所示:

Java类加载器详解(定义作用及实现原理)-mikechen

双亲委派模型

Java类加载器采用了双亲委派模型,在这个模型中,有多个类加载器按层次结构组织,包括根加载器、扩展类加载器、系统类加载器和用户自定义加载器。

类加载器遵循双亲委派模型,即当加载类的请求到来时,它首先将加载请求委派给父加载器。

只有在父加载器无法加载该类时,它才尝试加载该类,这样的模型可以确保类的一致性和安全性,避免类的重复加载。

 

类加载器层次结构

Java类加载器形成了一个层次结构,其中每个类加载器都有一个父加载器,直到根加载器。

根加载器负责加载Java核心类库,扩展类加载器负责加载扩展类库,系统类加载器负责加载应用程序类,用户可以创建自定义类加载器来扩展这个层次结构。

 

自定义类加载器

Java允许开发者创建自定义类加载器,以满足特定需求。

自定义类加载器可以继承系统类加载器,覆盖加载类的行为,实现类的动态加载、热部署、安全性控制等功能。

 

Java类加载总结

总的来说,Java类加载器是Java应用程序的关键组成部分,负责加载类文件并创建运行时的Java类,双亲委派模型和类加载器层次结构保证了类的安全性和一致性。

mikechen

mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

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

评论交流
    说说你的看法