【发布时间】:2022-11-03 00:09:28
【问题描述】:
我正在尝试通过 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 的 final 字段的等效方法?在 Google 中进行快速搜索并没有产生与上述解决方案不同的任何东西。我学到的唯一一件事是不可能覆盖静态最终字段,而仍然可以通过反射覆盖非静态最终字段,但我不知道如何。
【问题讨论】:
-
您无需修改
modifiers字段。只需删除以下三行:Field modifiers = field.getClass().getDeclaredField("modifiers");、modifiers.setAccessible(true);和modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);。
标签: java reflection