Java – change the final variable through reflection. Why is there a difference between static and non static final variables
•
Java
Please refer to the code below
My question is why exceptions are not thrown in the case of non - static final variables, and vice versa Why is there a difference?
import java.lang.reflect.Field;
import java.util.Random;
public class FinalReflection {
final static int stmark = computeRandom();
final int inmark = computeRandom();
public static void main(String[] args) throws SecurityException,NoSuchFieldException,IllegalArgumentException,illegalaccessexception {
FinalReflection obj = new FinalReflection();
System.out.println(FinalReflection.stmark);
System.out.println(obj.inmark);
Field staticFinalField = FinalReflection.class.getDeclaredField("stmark");
Field instanceFinalField = FinalReflection.class.getDeclaredField("inmark");
staticFinalField.setAccessible(true);
instanceFinalField.setAccessible(true);
instanceFinalField.set(obj,100);
System.out.println(obj.inmark);
staticFinalField.set(FinalReflection.class,101);
System.out.println(FinalReflection.stmark);
}
private static int computeRandom() {
return new Random().nextInt(5);
}
}
Solution
FinalReflectionobj = new FinalReflection();
FinalReflectionobj = new FinalReflection();
System.out.println(FinalReflection.stmark);
System.out.println(obj.inmark);
Field staticFinalField = FinalReflection.class.getDeclaredField("stmark");
Field instanceFinalField = FinalReflection.class.getDeclaredField("inmark");
staticFinalField.setAccessible(true);
instanceFinalField.setAccessible(true);
//EXTRA CODE
//Modify the final using reflection
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(staticFinalField,staticFinalField.getModifiers() & ~Modifier.FINAL);
instanceFinalField.set(obj,100);
System.out.println(obj.inmark);
staticFinalField.set(FinalReflection.class,101);
System.out.println(FinalReflection.stmark);
This solution does not have any disadvantages, it may not work in all cases:
If the final field is initialized as a compile time constant in the field declaration, changes to the final field may not be visible because using the final field at compile time will be replaced with a compile time constant
Another problem is that the specification allows active optimization of the final domain In a thread, it is allowed to reorder the reading of the final field with the modification of the final field that does not occur in the constructor This is also a similar problem in more
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码
