Насколько я знаю, вы больше не можете выполнять следующий трюк, начиная с с 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());
}
}
Код: Выделить всё
foobar java.lang.NoSuchFieldException: modifiers at java.base/java.lang.Class.getDeclaredField(Class.java:2610) at Example.main(Example.java:24) foobar
Существует ли эквивалентный метод перезаписи конечного поля для более новых версий Java? Быстрый поиск в Google не дал ничего отличного от приведенного выше решения. Единственное, что я узнал, это то, что невозможно перезаписать статическое конечное поле, хотя перезаписать нестатическое конечное поле все еще можно с помощью Reflection, но я не смог понять, как это сделать.
Подробнее здесь: https://stackoverflow.com/questions/742 ... in-java-17
Мобильная версия