Fare riferimento al codice riportato di seguito. Quando eseguo il codice, sono in grado di modificare il valore di una variabile non statica finale. Ma se provo a cambiare il valore di una variabile statica finale, getta java.lang.IllegalAccessException
.modifica delle variabili finali tramite la riflessione, perché differenza tra variabile finale statica e non statica
La mia domanda è perché non genera un'eccezione anche in caso di variabile finale non statica o viceversa. Perché la differenza?
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);
}
}
Ho pubblicato il codice che non fornisce un'eccezione. Ma è sicuramente un hack. –