Java 虚拟机类加载的时机

Java虚拟机在运行Java程序时,按需加载类。类的加载时机分为以下几种:

当程序创建对象的时候,需要用到类的定义,而该类还没有被加载,此时虚拟机会进行类加载操作。

当程序调用静态方法或访问静态字段的时候,需要用到类的定义,而该类还没有被加载,此时虚拟机会进行类加载操作。

当程序使用反射API对类进行反射调用的时候,需要用到类的定义,而该类还没有被加载,此时虚拟机会进行类加载操作。

当程序执行的主类没有被加载的时候,虚拟机会进行类加载操作。

当程序执行的主类被加载之后,如果主类中包含了其他类的定义,而这些类还没有被加载,此时虚拟机会进行类加载操作。

下面是一个示例,演示了在程序运行过程中,虚拟机按需加载类的行为。

public class Main {
    public static void main(String[] args) {
        new MyClass();
    }
}

class MyClass {
    static {
        System.out.println("MyClass was loaded!");
    }
}

运行这个程序时,会先加载Main类。当执行new MyClass()时,会触发虚拟机加载MyClass类,并执行该类的静态初始化块。因此,程序的输出结果为:

MyClass was loaded!

从输出结果可以看出,MyClass类在程序执行过程中被加载,而不是一开始就被加载。这就是虚拟机按需加载类的机制。