В javadoc для заданного метода класса Field ясно сказано, что ExceptionInInitializerError может возникнуть, если инициализация, вызванная этим методом, не выполняется. Мне было интересно, что классы становятся лениво инициализированы, когда они ссылаются или когда мы используем Class.forName("двоичное имя", true, ClassLoader). Инициализация класса не прерывается, тогда переменные класса инициализируются в соответствии со значением, объявление или как в статическом конструкторе. Когда поле было инициализировано, может ли он эксклюменить throwExceptionInInitializerError при вызове методом класса Field?
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
}
}