0
点赞
收藏
分享

微信扫一扫

java 类的加载时机

半夜放水 2023-07-20 阅读 51

Java类的加载时机

简介

在了解Java类的加载时机之前,我们需要知道什么是类加载。类加载是指将类的字节码文件加载到内存中,并在内存中创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载是Java虚拟机对类进行验证、准备、解析的过程,最终将类加载到内存中。

类加载的过程

类加载的过程可以分为以下几个步骤:

  1. 加载:查找并加载类的字节码文件到内存中。
  2. 验证:确保类的字节码文件符合Java虚拟机的规范,保证安全性。
  3. 准备:为类的静态变量分配内存,并设置默认初始值。
  4. 解析:将类的符号引用转换为直接引用,为虚拟机执行引擎准备好直接引用。
  5. 初始化:执行类的初始化方法,为类的静态变量赋值,执行静态代码块和静态成员变量的初始化。

下面我们分别对每个步骤进行详细说明。

1. 加载

加载阶段是类加载的第一步,它负责查找并加载类的字节码文件到内存中。类加载器根据类的名称来查找字节码文件,找到后将其读取到内存中,并生成对应的Class对象。

在Java中,类的加载由Java虚拟机完成。常见的类加载器有如下几种:

  • 启动类加载器:负责加载Java核心类库,由C++编写。
  • 扩展类加载器:负责加载Java扩展类库,由Java编写。
  • 应用程序类加载器:负责加载应用程序的类,也叫系统类加载器。

代码示例:

Class.forName("com.example.MyClass");

2. 验证

验证阶段是类加载的第二步,它确保类的字节码文件符合Java虚拟机的规范,保证安全性。验证过程包括文件格式验证、元数据验证、字节码验证和符号引用验证。

代码示例:

无需手动执行验证阶段,由Java虚拟机自动完成。

3. 准备

准备阶段是类加载的第三步,它为类的静态变量分配内存,并设置默认初始值。这里需要注意的是,这里只是分配内存,并不会为静态变量赋值。

代码示例:

public class MyClass {
    public static int count; // 在准备阶段,分配内存,并设置默认初始值0
}

4. 解析

解析阶段是类加载的第四步,它将类的符号引用转换为直接引用,为虚拟机执行引擎准备好直接引用。符号引用指的是在编译阶段通过符号引用指向的目标,而直接引用是可以直接指向目标的指针、偏移量或者直接内存地址。

代码示例:

无需手动执行解析阶段,由Java虚拟机自动完成。

5. 初始化

初始化阶段是类加载的最后一步,它执行类的初始化方法,为类的静态变量赋值,执行静态代码块和静态成员变量的初始化。在初始化阶段,Java虚拟机会确保一个类只被初始化一次。

代码示例:

public class MyClass {
    public static int count;
    
    static {
        count = 100; // 静态代码块中为静态变量赋值
        System.out.println("Static block executed");
    }
}

总结

Java类的加载时机是一个重要的概念,它决定了类在何时被加载到内存中,并执行相应的操作。了解类加载的过程,对于理解Java的运行机制和调优都非常有帮助。在实际开发中,我们通常无需手动干预类加载的过程

举报

相关推荐

0 条评论