为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕姐8265434 2019-05-30 17:45:11
使用Java反射更改私有静态最终字段我有一节课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);
查看完整描述

4 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

如果分配给static final boolean字段在编译时已知,它是常量。原初的或String类型可以是编译时常量。在引用该字段的任何代码中都会内联一个常量。由于该字段在运行时没有实际读取,因此更改该字段将不会产生任何影响。

这个Java语言规范他说:

如果字段是一个常量变量(§4.12.4),那么删除关键字Final或更改其值不会导致它们不运行而破坏与现有二进制文件的兼容性,但是除非重新编译,否则它们将不会看到使用该字段的任何新值。即使使用本身不是编译时常量表达式,也是如此(§15.28)

下面是一个例子:

class Flag {
  static final boolean FLAG = true;}class Checker {
  public static void main(String... argv) {
    System.out.println(Flag.FLAG);
  }}

如果你反编译Checker,你将看到这一点,而不是引用Flag.FLAG,代码简单地推送值为1(true)到堆栈上(指令3)。

0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;

3:   iconst_1

4:   invokevirtual   #3; //Method java/io/PrintStream.println:(Z)V

7:   return


查看完整回答
反对 回复 2019-05-30
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

我也把它和Joor图书馆

只管用

      Reflect.on(yourObject).set("finalFieldName", finalFieldValue);

我还解决了一个问题override以前的解决方案似乎忽略了这一点。但是,只有在没有其他好的解决方案的情况下,才要非常小心地使用这个方法。


查看完整回答
反对 回复 2019-05-30
  • 4 回答
  • 0 关注
  • 1478 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信