Proszę odnieść się do poniższego kodu. Po uruchomieniu kodu mogę zmienić wartość końcowej zmiennej niestatycznej. Ale jeśli spróbuję zmienić wartość końcowej zmiennej statycznej, wówczas wyrzuca ona java.lang.IllegalAccessException
.zmiana ostatecznych zmiennych poprzez odbicie, dlaczego różnica między statyczną a niestatyczną zmienną końcową
Moje pytanie brzmi: dlaczego nie wyrzuca wyjątku w przypadku niestatycznej zmiennej końcowej również lub odwrotnie. Dlaczego różnica?
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);
}
}
Opublikowałem kod, który nie daje wyjątku. Ale na pewno jest to hak. –