Когда можно Field.set (Object obj, Object value) бросить ExceptionInInitializerError

1

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

Теги:
class
reflection

1 ответ

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
    }
}
  • 0
    Таким образом, статический блок инициализатора выдает исключение, но поскольку вызывающий метод является методом set класса Field, он выдает исключение ??
  • 0
    @kumar Это правильно. (На самом деле, я думаю, что метод ловит и отбрасывает его.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню