何时可以Field.set(Object obj,Object value)抛出ExceptionInInitializerError

时间:2014-08-04 14:41:03

标签: java class reflection

javadoc类的set方法的Field明确指出,如果此方法引发的初始化失败,则可能发生ExceptionInInitializerError。  我想知道在引用它们时或者当我们使用Class.forName(“二进制名称”,“true,ClassLoader”)时,Classes会被懒惰地初始化。如果类的初始化没有失败,那么类变量已根据分配的值初始化声明或在静态构造函数中。一旦一个字段已经初始化,它可以在Field的类集方法调用时明确抛出ExceptionInInitializerError吗?

1 个答案:

答案 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
    }
}