李优秀 发表于 2025-3-13 04:10:39

Java 的类加载过程是怎样的?

Java 的类加载过程

<hr> 问题

Java 的类加载过程是怎样的?
<hr> 解答

Java 的类加载过程是将 .class 文件中的字节码加载到 JVM 中,并进行验证、剖析和初始化,最终使类可以或许利用的过程。整个类加载过程由以下三个阶段组成:加载(Loading)、毗连(Linking) 和 初始化(Initialization)。
<hr> 类加载过程详解

1. 加载(Loading)

加载是类加载的第一个阶段,包罗以下内容:


[*]寻找和加载类的二进制数据:
   
[*]通过类的全限定名定位 .class 文件。   
[*]支持从多种泉源加载(如文件体系、网络、JAR 包等)。

[*]将类的字节码读入内存:
   
[*]将 .class 文件中的内容读取到 JVM 内部的运行时数据区(方法区)。

[*]生成 Class 对象:
   
[*]在 JVM 的方法区中生成类的 Class 对象,用于表示这个类的元数据。

<hr> 2. 毗连(Linking)

毗连阶段将类的二进制数据组合进 JVM,同时验证和预备类。包罗以下三个子阶段:

[*] 验证(Verification):
   
[*]确保类的字节码符合 JVM 规范。   
[*]验证内容:
   
[*]文件格式查抄(例如魔数是否正确)。   
[*]元数据查抄(类的字段、方法是否合法)。   
[*]字节码验证(是否符合 Java 语言规则)。   
   
[*]目的:保证字节码的安全性和可靠性。

[*] 预备(Preparation):
   
[*]为类的静态变量分配内存,并初始化为默认值。
   
[*]基本类型:分配初始值(如 0、null 等)。   
[*]引用类型:初始化为 null。   
   
[*]仅仅分配内存,未实行任何逻辑。

[*] 剖析(Resolution):
   
[*]将常量池中的符号引用(Symbolic References)转换为直接引用(Direct References)。
   
[*]符号引用:以字符串形式描述引用的类、方法、字段等。   
[*]直接引用:运行时的内存地点。   
   

<hr> 3. 初始化(Initialization)

初始化是类加载的最后阶段,主要任务是:


[*]实行类的静态初始化块(static {})和静态变量的初始化。
[*]按顺序实行类的静态变量和静态块,确保只实行一次。
[*]假如父类未被加载,先加载父类。
class Example {
   
    static int x = 10;

    static {
   
      System.out.println("Static block executed.")
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Java 的类加载过程是怎样的?