static boolean isClassLoaded(String fullname) {
try {
Class.forName(fullname, false, Loader.instance().getModClassLoader());
return true;
} catch (Exception e) {
return false;
}
}
此方法是否有可能触发 fullname 的静态初始化程序? 我对调用两次静态初始化程序有问题。 当我尝试检查是否使用 isClassLoaded 加载类并尝试使用该类时,由于构造函数被调用两次而出现错误。 任何人都知道 Class.forName(fullname, false, Loader.instance().getModClassLoader()); 有什么问题?
最佳答案
第二个参数是一个名为“initialize”的标志。
来自docs :
The class is initialized only if the initialize parameter is true and if it has not been initialized earlier.
因此,如果 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 staticinitializer
,但在这里,它首先打印 blah
,即第一个 Class.forName
调用没有执行静态初始化程序。
关于java静态初始化器被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33040829/