在Java编程语言中,类的加载是一个重要的过程,它通常在以下几种情况下发生:
1. 主动加载(Explicit Loading):
当程序中直接使用`new`关键字创建类的实例时。
使用`Class.forName()`方法显式加载类。
使用`java.lang.reflect`包中的`Class`类的方法加载类。
Java虚拟机启动时,需要指定要执行的主类(main方法所在的类)。
2. 被动加载(Implicit Loading):
当Java虚拟机加载一个类,作为另一个类的成员时,如果这个类还没有被加载,那么它将被加载。
当Java虚拟机使用反射API来访问某个类的时候。
3. 条件加载(Conditional Loading):
当使用`java.lang.Runtime.getRuntime().loadLibrary(String libname)`方法加载本地的库时,如果库中包含的类还没有被加载,它们将被加载。
4. 解析和初始化:
类的加载过程包括解析和初始化两个阶段。解析阶段是在类加载后,虚拟机使用符号引用替换掉编译阶段的常量池中的符号引用,指向真实的类、接口、字段和方法的直接引用的过程。
初始化阶段是在类加载之后、开始执行虚拟机方法之前进行的准备活动。
类的加载时机取决于具体的使用场景。在Java中,类加载器负责类的加载过程,它通常在类被引用时才会加载类。但是,具体的加载时机和过程可能会受到Java虚拟机规范和具体实现的影响。