cambiando las variables finales a través de la reflexión, por qué la diferencia entre la variable final estática y no estática

Por favor, consulte el siguiente código. Cuando ejecuto el código, puedo cambiar el valor de una variable final no estática. Pero si trato de cambiar el valor de una variable estática final, entonces arrojajava.lang.IllegalAccessException.

Mi pregunta es por qué no lanza una excepción en caso de variable final no estática también o viceversa. ¿Por qué la diferencia?

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta