0
static boolean isClassLoaded(String fullname) {
    try {
        Class.forName(fullname, false, Loader.instance().getModClassLoader());
        return true;
    } catch (Exception e) {
        return false;
    }
}

此方法是否有可能触发全名的静态初始化程序?我有两次调用静态初始化程序的问题。当我尝试检查是否使用 isClassLoaded 加载了类并尝试使用该类时,由于构造函数调用了两次,我得到了错误。任何人都知道 Class.forName(fullname, false, Loader.instance().getModClassLoader()) 有什么问题;?

4

1 回答 1

1

第二个参数是一个名为“initialize”的标志。

文档

仅当 initialize 参数为 true 且之前未初始化时,才会初始化该类。

因此,如果initialize设置为false,它将不会执行您的静态初始化程序。

独立的例子

package test;

public class Main {

    public static void main(String[] args) throws Exception {
        Class.forName("test.Main$Foo", false, Main.class.getClassLoader());
        System.out.println("blah");
        Class.forName("test.Main$Foo", true, Main.class.getClassLoader());
    }

    static class Foo {
        static {
            System.out.println("Foo static initializer");
        }
    }

}

输出

blah
Foo static initializer

请注意,它总是Foo static initializer只打印一次,但在这里,它blah首先打印,即第一次Class.forName调用没有执行静态初始化程序。

于 2015-10-09T14:34:49.113 回答