Please refer to the below code. 
When I run the code, I am able to change the value of a final non-static variable. But if I try to change the value of a final static variable then it throws java.lang.IllegalAccessException.
My question is why doesn't it throw an exception in case of non-static final variable also or vice versa. Why the 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);
    }
}
 
     
     
     
     
    