Java 反射:设置最终字段不起作用



因此,我用一些有用的方法创建了一个ReflectUtil类,使我能够以快速简单的方式访问java反射API。基于此,方法forceCall可以改变私有和最终字段的值。

这个例子非常好:

ReflectUtil.forceCall(Boolean.class, null, "FALSE", true);
System.out.println(String.format("Everything is %s", false));

输出是:Everything is true(所以我的方法是有效的(。

但这根本不起作用(如果我在没有ReflectUtil类的情况下尝试,它也不起作用(:

public class JustForTestingPurposes {
private static final String field = "no";
public static void main(String[] args) throws Exception {
ReflectUtil.forceCall(JustForTestingPurposes.class, null, "field", "yes");
System.out.println(String.format("Is this working? %s", field));
}
}

输出为:Is this working? no

我想,也许是因为java赋值的方式,所以我在执行主方法中的代码之前添加了1秒睡眠,但没有成功。

这就是常量在java中的工作方式。

编译java程序时,对编译时常数的所有引用(使用文字或<Classname>.class或类似内容(都将替换为常数本身。

您应该能够通过将其分配给方法的返回值或使用new运算符(以下示例包含两者(来绕过此问题:

private static final String field = getNo();
private String getNo(){
return new String("no");
}

最新更新