javadoc类的set方法的Field明确指出,如果此方法引发的初始化失败,则可能发生ExceptionInInitializerError。 我想知道在引用它们时或者当我们使用Class.forName(“二进制名称”,“true,ClassLoader”)时,Classes会被懒惰地初始化。如果类的初始化没有失败,那么类变量已根据分配的值初始化声明或在静态构造函数中。一旦一个字段已经初始化,它可以在Field的类集方法调用时明确抛出ExceptionInInitializerError吗?
答案 0 :(得分:4)
Field#set(Object, Object)
可用于设置static
字段。如果您尝试set
一个单元化类的字段,JVM将首先尝试初始化该类。如果发生故障,则set
将抛出ExceptionInInitializerError
。请参阅以下示例:
public class Example {
public static void main(String[] args) throws Exception {
Field field = Fail.class.getDeclaredField("number");
field.set(null, 42); // Fail class isn't initialized at this point
}
}
class Fail {
static int number;
static {
boolean val = true;
if (val)
throw new RuntimeException(); // causes initialization to end with an exception
}
}