首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Java反射更改私有静态最终字段

使用Java反射更改私有静态最终字段
EN

Stack Overflow用户
提问于 2010-07-22 00:35:49
回答 7查看 290.7K关注 0票数 521

我有一个带有private static final字段的类,不幸的是,我需要在运行时更改它。

使用反射时,我得到这个错误:java.lang.IllegalAccessException: Can not set static final boolean field

有什么方法可以改变这个值吗?

代码语言:javascript
复制
Field hack = WarpTransform2D.class.getDeclaredField("USE_HACK");
hack.setAccessible(true);
hack.set(null, true);
EN

回答 7

Stack Overflow用户

发布于 2015-07-07 20:47:25

我还将它与joor library集成在一起

只需使用

代码语言:javascript
复制
      Reflect.on(yourObject).set("finalFieldName", finalFieldValue);

此外,我还修复了override的一个问题,这似乎是以前的解决方案所遗漏的。然而,只有在没有其他好的解决方案的情况下,才要非常小心地使用它。

票数 8
EN

Stack Overflow用户

发布于 2017-06-07 18:32:39

除了排名靠前的答案之外,你还可以使用一些最简单的方法。Apache commons的FieldUtils类已经有了可以做这些事情的特定方法。请看一下FieldUtils.removeFinalModifier方法。您应该指定目标字段实例和辅助功能强制标志(如果您使用非公共字段)。更多信息你可以在here上找到。

票数 7
EN

Stack Overflow用户

发布于 2017-03-25 14:06:44

在存在安全管理器的情况下,可以使用AccessController.doPrivileged

从上面接受的答案中取相同的例子:

代码语言:javascript
复制
import java.lang.reflect.*;

public class EverythingIsTrue {
    static void setFinalStatic(Field field, Object newValue) throws Exception {
        field.setAccessible(true);
        Field modifiersField = Field.class.getDeclaredField("modifiers");

        // wrapping setAccessible 
        AccessController.doPrivileged(new PrivilegedAction() {
            @Override
            public Object run() {
                modifiersField.setAccessible(true);
                return null;
            }
        });

        modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
        field.set(null, newValue);
    }

    public static void main(String args[]) throws Exception {      
      setFinalStatic(Boolean.class.getField("FALSE"), true);
      System.out.format("Everything is %s", false); // "Everything is true"
    }
}

在λ表达式中,AccessController.doPrivileged可以简化为:

代码语言:javascript
复制
AccessController.doPrivileged((PrivilegedAction) () -> {
    modifiersField.setAccessible(true);
    return null;
});
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3301635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档