Cannot change static final field using java reflection?
java
Solution
When accessing primitive static final fields, the Java compiler will assume that the value is a constant and inline the value instead of generating code that accesses the field. This means that the compiler will replace with the reference to the `FALSE` field with the value `false`. If you use reflection to access the field, you will see that the value of the field has actually changed.
This will not work for non-primitive fields, as the value of an object reference can not be inlined at compile time.
Problem
I recently stumbled upon Change private static final field using Java reflection and tested polygenelubricants' `EverythingIsTrue` class, works fine, `System.out.format("Everything is %s", false);` prints `Everything is true` indeed. But when I change the code as ``` public class EverythingIsTrue { public static final boolean FALSE = false; 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(EverythingIsTrue.class.getField("FALSE"), true); System.out.format("Everything is %s", FALSE); } } ``` it prints ``` Everything is false ``` Does anybody know why? Does setFinalStatic actually work or not?