2

我需要加载一些类以及它们各自的静态初始化,例如,在工厂方法实现中。

如果我只是使用以下语法引用该类,则 JVM 不会运行静态初始化部分。实际上,JVM 甚至会加载类吗?

Class<Shape> shapeClass = Shape.class;
或者
Shape s = null;

但是使用 class.forname() 它确实执行静态初始化。 Class.forname("Shape"); 问题是这是否是加载 java 类和静态初始化的唯一方法?或者还有其他方法吗?使用 class.forname() 有什么显着的性能损失吗?

4

2 回答 2

3

来自 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

但是如果你加载 Test2

Class.forName("test.Test2", false, ClassLoader.getSystemClassLoader());

不会有输出。您也可以使用此测试来查看Test.class.getName()也没有加载该类。

让它加载的最简单方法是添加一个空的静态方法并调用它:

class Test2 {
     public static void load() {
     }
     ...
Test2.load();
于 2013-05-03T08:10:08.203 回答
1

当您加载/解析一个类时,静态初始化程序将按照它们定义的顺序执行。无论您如何加载它们,反射与否都无关紧要。也就是说,除非您的意思是其他类型的初始化?

于 2013-05-03T07:54:30.353 回答