在过去,有可能在单元测试期间更改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
这样的大型库。
今天还有可能吗?
你应该使用的是来自PowerMock的@PrepareForTest
;在引擎盖下它使用javassist,它使用Instrumentation API,使你可以模拟以前的任何东西。
只有vanilla java方式从java-12中消失了,因为与modifiers
的黑客攻击将不再起作用。
我发现测试的价值如下:
class MyObject {
public static final Boolean myfield = "true";
}
我不知道为什么,但现在改变字段如下让我再次通过反射改变字段:
public static final Boolean myfield = Boolean.TRUE;