我试图修改像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/

10-12 00:41