Java反射提交的值更新

时间:2016-12-17 09:51:13

标签: java reflection

我从Change private static final field using Java reflection获取了引用,并在下面写了代码来更新String类型的静态最终字段值:

我有一个类包含如下的常量:

public final class Constants {

    public static final String ACCEPTED = "A";
}

我尝试使用Java Reflection更新它的值,如下所示:

Field field = Constants.class.getDeclaredField("ACCEPTED");
    field.setAccessible(true);

    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

    String newValue = "B";
    field.set(null, newValue);

使用上面的代码更新值后,我测试了它,如下所示:

String myUpdatedValue = Constants.ACCEPTED;

当我检查Constants.ACCEPTED时,显示的值是“B”,但是当我检查myUpdatedValue时,它显示为“A”< / strong>即可。无法理解原因。即使我将此值传递给其他方法作为参数,在方法中调用它的“B”但在被调用的方法中它是“A”

1 个答案:

答案 0 :(得分:1)

引用the documentation

  

注意:如果将基本类型或字符串定义为常量并且该值在编译时已知,则编译器会将代码中的常量名称替换为其值。这称为编译时常量。如果外部世界中常量的值发生变化(例如,如果立法规定pi实际上应该是3.975),则需要重新编译使用此常量来获取当前值的任何类。

在您的情况下,Constants.ACCEPTED是一个编译时常量。因此,在编译代码时,Constants.ACCEPTED的所有引用实际上都替换为文字"A"。你的代码在运行时操纵它的值,但这已经太晚了。