java - changing final variables through reflection, why difference between static and non-static final variable -
please refer below code. when run code, able change value of final non-static variable. if try change value of final static variable throws java.lang.illegalaccessexception.
my question why doesn't throw exception in case of non-static final variable or vice versa. why 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); } }
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 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 not come without downsides, may not work in cases:
in case final field initialized compile-time constant in field declaration, changes final field may not visible, since uses of final field replaced @ compile time compile-time constant.
another problem specification allows aggressive optimization of final fields. within thread, permissible reorder reads of final field modifications of final field not take place in constructor. more on explained in similar question.
Comments
Post a Comment