我从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”。
答案 0 :(得分:1)
注意:如果将基本类型或字符串定义为常量并且该值在编译时已知,则编译器会将代码中的常量名称替换为其值。这称为编译时常量。如果外部世界中常量的值发生变化(例如,如果立法规定pi实际上应该是3.975),则需要重新编译使用此常量来获取当前值的任何类。
在您的情况下,Constants.ACCEPTED
是一个编译时常量。因此,在编译代码时,Constants.ACCEPTED
的所有引用实际上都替换为文字"A"
。你的代码在运行时操纵它的值,但这已经太晚了。