Vui lòng tham khảo mã bên dưới. Khi tôi chạy mã, tôi có thể thay đổi giá trị của một biến không phải tĩnh cuối cùng. Nhưng nếu tôi cố gắng thay đổi giá trị của biến tĩnh cuối cùng thì nó sẽ ném java.lang.IllegalAccessException
.thay đổi các biến cuối cùng thông qua sự phản ánh, tại sao sự khác biệt giữa biến cuối cùng tĩnh và không tĩnh
Câu hỏi của tôi là tại sao nó không ném ngoại lệ trong trường hợp biến cuối cùng không tĩnh cũng hoặc ngược lại. Tại sao sự khác biệt?
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);
}
}
Tôi đã đăng mã không đưa ra ngoại lệ. Nhưng nó là một hack cho chắc chắn. –