gpt4 book ai didi

java - 无法无异常地修改私有(private)最终静态变量

转载 作者:行者123 更新时间:2023-12-03 04:28:21 25 4
gpt4 key购买 nike

我尝试修改私有(private)最终静态变量,如 this :

    ...try {

Field f =TargetA.class.getDeclaredField("RECV_TIMEOUT");
f.setAccessible(true);

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

f.set(null, 12L);

} catch (Exception e) {
e.printStackTrace();//not reach here!
} ...

class TargetA{
private static final long RECV_TIMEOUT = 180000L;
}

但是TargetA.RECV_TIMEOUT仍然是180000L,没有任何异常。我在StackOverflow中搜索了该问题,但没有找到解决方案。

我猜 Java 1.6 版本在反射方面有更多限制,这违反了 OO 规则。感谢您的建议!

最佳答案

您可以通过这种方式更改静态最终字段,如果您使用反射查看该值,它将被更改。您遇到的问题是编译器进行了一项且仅有一项优化,即在编译时内联已知的常量。这意味着该值可以更改,但使用常量的位置不会更改。

解决这个问题的方法是使用包装器方法来“迷惑”编译器,从而避免更改常量的使用方式。

public static final long RECV_TIMEOUT = runtime(180000L);

public static final <T> T runtime(T t) { return t; }

关于java - 无法无异常地修改私有(private)最终静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7241278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com