过去,例如在单元测试期间,可以如下更改static final
字段:
static void setFinalStatic(Field field, Object newValue) {
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
致电:
setFinalStatic(MyObject.class.getField("myfield"), "newval");
但是从Java 11(甚至更早)开始,这似乎不再可行(目标字段未更改)。
现在强制进行静态最终字段更改的机会是什么?
我知道这是一种黑客。但是在特殊情况下,例如在单个junit测试期间,这是因为不必导入诸如PowerMock
之类的较大的库。
今天还有可能吗?
答案 0 :(得分:0)
您应该使用的是PowerMock的@PrepareForTest
;在幕后它使用javassist,后者使用了Instrumentation API,这使您可以模拟以前的内容。
java-12中仅保留了原始的java方式,因为用modifiers
进行的破解将不再起作用。
答案 1 :(得分:-1)
我发现被测值如下:
class MyObject {
public static final Boolean myfield = "true";
}
我不知道为什么,但是现在按如下所示更改字段,让我再次通过反射更改字段:
public static final Boolean myfield = Boolean.TRUE;