我有一个带有private static final
字段的类,不幸的是,我需要在运行时更改它。
使用反射时,我得到这个错误:java.lang.IllegalAccessException: Can not set static final boolean field
有什么方法可以改变这个值吗?
Field hack = WarpTransform2D.class.getDeclaredField("USE_HACK");
hack.setAccessible(true);
hack.set(null, true);
发布于 2015-07-07 20:47:25
我还将它与joor library集成在一起
只需使用
Reflect.on(yourObject).set("finalFieldName", finalFieldValue);
此外,我还修复了override
的一个问题,这似乎是以前的解决方案所遗漏的。然而,只有在没有其他好的解决方案的情况下,才要非常小心地使用它。
发布于 2017-06-07 18:32:39
除了排名靠前的答案之外,你还可以使用一些最简单的方法。Apache commons的FieldUtils
类已经有了可以做这些事情的特定方法。请看一下FieldUtils.removeFinalModifier
方法。您应该指定目标字段实例和辅助功能强制标志(如果您使用非公共字段)。更多信息你可以在here上找到。
发布于 2017-03-25 14:06:44
在存在安全管理器的情况下,可以使用AccessController.doPrivileged
从上面接受的答案中取相同的例子:
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
可以简化为:
AccessController.doPrivileged((PrivilegedAction) () -> {
modifiersField.setAccessible(true);
return null;
});
https://stackoverflow.com/questions/3301635
复制相似问题