Bitte beachten Sie den folgenden Code. Wenn ich den Code ausführen, kann ich den Wert einer endgültigen nicht statischen Variable ändern. Wenn ich jedoch versuche, den Wert einer endgültigen statischen Variablen zu ändern, wird java.lang.IllegalAccessException
ausgegeben.Ändern von Endvariablen durch Reflexion, warum Unterschied zwischen statischer und nicht-statischer Endvariable
Meine Frage ist, warum wirft es nicht eine Ausnahme im Falle von nicht-statischen endgültigen Variable auch oder umgekehrt. Warum der Unterschied?
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);
}
}
Ich habe den Code gepostet, der keine Ausnahme gibt. Aber es ist sicher ein Hack. –