如何在jdk11中重写静态final字段?

问题描述 投票:0回答:2

在过去,有可能在单元测试期间更改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这样的大型库。

今天还有可能吗?

java java-11
2个回答
0
投票

你应该使用的是来自PowerMock的@PrepareForTest;在引擎盖下它使用javassist,它使用Instrumentation API,使你可以模拟以前的任何东西。

只有vanilla java方式从java-12中消失了,因为与modifiers的黑客攻击将不再起作用。


-1
投票

我发现测试的价值如下:

class MyObject {
   public static final Boolean myfield = "true";
}

我不知道为什么,但现在改变字段如下让我再次通过反射改变字段:

 public static final Boolean myfield = Boolean.TRUE;
© www.soinside.com 2019 - 2024. All rights reserved.