Перезапись конечных полей в Java 17JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Перезапись конечных полей в Java 17

Сообщение Anonymous »

Я пытаюсь перезаписать значение нестатического конечного поля с помощью Reflection в Java 17.
Насколько я знаю, вы больше не можете выполнять следующий трюк, начиная с с Java 12 и выше:

Код: Выделить всё

import java.lang.reflect.*;

class Foo {
private final String bar;

public Foo(String bar) {
this.bar = bar;
}

public String getBar() {
return this.bar;
}

}

public class Example {

public static void main(String[] args) {
Foo foo = new Foo("foobar");
System.out.println(foo.getBar());

try {
Field field = foo.getClass().getDeclaredField("bar");
field.setAccessible(true);
Field modifiers = field.getClass().getDeclaredField("modifiers");
modifiers.setAccessible(true);
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
} catch (Exception e) {
e.printStackTrace();
}

System.out.println(foo.getBar());
}

}
Когда я запускаю это в Java 17, выдается следующее исключение:

Код: Выделить всё

foobar java.lang.NoSuchFieldException: modifiers    at java.base/java.lang.Class.getDeclaredField(Class.java:2610)  at Example.main(Example.java:24) foobar
И значение «bar» остается неизменным.
Существует ли эквивалентный метод перезаписи конечного поля для более новых версий Java? Быстрый поиск в Google не дал ничего отличного от приведенного выше решения. Единственное, что я узнал, это то, что невозможно перезаписать статическое конечное поле, хотя перезаписать нестатическое конечное поле все еще можно с помощью Reflection, но я не смог понять, как это сделать.

Подробнее здесь: https://stackoverflow.com/questions/742 ... in-java-17
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»