我试图修改像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 - 没有异常(exception),无法修改私有(private)最终静态变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7241278/