gpt4 book ai didi

java静态初始化器被调用两次

转载 作者:行者123 更新时间:2023-12-01 11:05:10 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com