Nghe có vẻ hơi lạ, nhưng có thể thêm công cụ sửa đổi final
vào thời gian chạy không?Thêm công cụ sửa đổi cuối cùng khi chạy trong Java
Tôi có một biến được đánh dấu là public static int/short
. Tại thời điểm nhất định, tôi muốn ngăn thay đổi giá trị của nó và tôi muốn giữ khả năng truy cập của nó dưới dạng giá trị tĩnh chuẩn (ClassName.field
).
public class Main {
private static int a = 0;
public static void addFinalMod(Field f) {
Field modifiersField = null;
try {
modifiersField = Field.class.getDeclaredField("modifiers");
}
catch (NoSuchFieldException e) {
e.printStackTrace();
}
modifiersField.setAccessible(true);
try {
modifiersField.setInt(f, f.getModifiers() & Modifier.FINAL);
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println(a);
try {
Field f = Main.class.getDeclaredField("a");
addFinalMod(f);
}
catch (NoSuchFieldException e) {
e.printStackTrace();
}
a = 10; //I was expecting error/exception here
System.out.println(a);
}
Output:
0
10
Đây thực sự là một câu hỏi thú vị. Bây giờ, với tôi, có vẻ như các quy tắc 'final' chỉ được kiểm tra trong thời gian biên dịch (điều này bao gồm cả yêu cầu khởi tạo và bảo đảm JMM). –
Tôi nghĩ bạn có nghĩa là 'f.getModifiers() | Modifier.FINAL' thay vào đó 'f.getModifiers() & Modifier.FINAL' để cho các biến tố khác ở lại. Ngoài ra, nếu bạn sẽ sử dụng 'f.thiết lập (null, 5); 'bạn sẽ nhận được ngoại lệ dự kiến. – Pshemo