Java Отражение: установка последнего поля не работает - PullRequest
0 голосов
/ 28 марта 2020

Итак, я создал класс ReflectUtil с некоторыми полезными методами, которые позволяют мне быстро и просто получить доступ к API отражения java. Основанный на this метод forceCall может изменить значение частного и конечного поля.

Этот пример работает абсолютно нормально:

ReflectUtil.forceCall(Boolean.class, null, "FALSE", true);
System.out.println(String.format("Everything is %s", false));

Вывод: Everything is true (так что мой метод работает).

Но это просто не работает (это также не работает, если я пробую это без моего класса ReflectUtil):

public class JustForTestingPurposes {
    private static final String field = "no";

    public static void main(String[] args) throws Exception {
        ReflectUtil.forceCall(JustForTestingPurposes.class, null, "field", "yes");
        System.out.println(String.format("Is this working? %s", field));
    }

}

Вывод: Is this working? no

Я подумал, может быть, это из-за способа, которым java присваивает значения, поэтому я добавил 1 se c sleep перед выполнением кода в основном методе, без успех.

1 Ответ

1 голос
/ 28 марта 2020

Вот как константы работают в java.

Когда программа java компилируется, все ссылки на постоянную времени компиляции (с использованием литерала или, возможно, <Classname>.class или подобного) заменяется самой константой.

Вы можете обойти это, присвоив его возвращаемому значению метода или используя оператор new (следующий пример содержит оба):

private static final String field = getNo();
private String getNo(){
    return new String("no");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...