java final set_使用Java反射更改私有静态final字段

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

我有一个java.lang.IllegalAccessException: Can not set static final boolean field字段的课程,不幸的是,我需要在运行时更改。

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

有没有办法改变价值?

Field hack = WarpTransform2D.class.getDeclaredField("USE_HACK");

hack.setAccessible(true);

hack.set(null, true);

9个解决方案

752 votes

假设没有Modifier.FINAL阻止你这样做,你可以使用field.getModifiers()来解决&并重置修改器以摆脱~,并实际修改final字段。

这是一个例子:

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");

modifiersField.setAccessible(true);

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"

}

}

假设没有抛出Modifier.FINAL,上面的代码打印field.getModifiers()。

这里实际做的是如下:

原始Modifier.FINAL值field.getModifiers()和&在~中自动编码为参考类型final“常量”final和final

反射用于更改Modifier.FINAL以参考Modifier.FINAL由field.getModifiers()提及

因此,随后每当Modifier.FINAL被自动装箱到field.getModifiers()时,它指的是与~相同的&

Modifier.FINAL的全部内容现在是field.getModifiers()

相关问题

使用反射更改Modifier.FINAL进行单元测试

如何将setAccessible限制为仅仅“合法”使用?有乱码Modifier.FINAL的缓存,变异field.getModifiers()等的例子

注意事项

每当你做这样的事情时,都应该格外小心。 它可能不起作用,因为M

你可能感兴趣的:(java,final,set)