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

使用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);


慕姐8265434
浏览 1498回答 4
4回答

慕斯709654

如果分配给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_14:   invokevirtual   #3; //Method java/io/PrintStream.println:(Z)V7:   return

30秒到达战场

我也把它和Joor图书馆只管用      Reflect.on(yourObject).set("finalFieldName", finalFieldValue);我还解决了一个问题override以前的解决方案似乎忽略了这一点。但是,只有在没有其他好的解决方案的情况下,才要非常小心地使用这个方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java
React.JS