我需要加载一些类及其各自的静态初始化,例如在工厂方法实现中。
如果我只是使用以下语法引用该类,JVM 不会运行静态初始化部分。实际上,JVM 是否加载了类?
Class<Shape> shapeClass = Shape.class;
或
Shape s = null;
但是使用 class.forname() 它确实执行静态初始化。
Class.forname("Shape");
问题是这是否是加载 java 类和静态初始化的唯一方法?或者还有其他方法吗?使用 class.forname() 有明显的性能损失吗?
最佳答案
来自 Class.forName(String className) API:调用此方法相当于:Class.forName(className, true, currentLoader)。
第二个参数 = true 表示初始化类,初始化类表示运行静态初始化器
这是一个要检查的测试
package test;
class Test2 {
static {
System.out.println("static init");
}
}
public class Test1 {
public static void main(String[] args) throws Exception {
Class.forName("test.Test2");
}
}
输出
static init
但是如果你用
加载 Test2Class.forName("test.Test2", false, ClassLoader.getSystemClassLoader());
不会有任何输出。您还可以使用此测试来查看 Test.class.getName()
也没有加载该类。
加载它的最简单方法是添加一个空的静态方法并调用它:
class Test2 {
public static void load() {
}
...
Test2.load();
关于java - 如何在使用 java 类之前加载静态初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16354027/