簡體   English   中英

Java 反射:設置最終字段不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM