[英]Java Reflection: setting a final field isn't working
因此,我使用一些有用的方法創建了一個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
Is this working? no
我想,也許是因為java分配值的方式,所以我在執行main方法中的代碼之前添加了1秒的睡眠,但沒有成功。
這就是常量在 Java 中的工作方式。
編譯 java 程序時,所有對編譯時常量的引用(使用文字或<Classname>.class
或類似的)都將替換為常量本身。
您應該能夠通過將其分配給方法的返回值或使用new
運算符來繞過它(以下示例包含兩者):
private static final String field = getNo();
private String getNo(){
return new String("no");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.