如何在jdk11中重写static final字段?

时间:2019-03-28 15:30:10

标签: java java-11

过去,例如在单元测试期间,可以如下更改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之类的较大的库。

今天还有可能吗?

2 个答案:

答案 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;