Tôi có một tình huống mà tôi phải thay đổi hằng số java.Thay đổi biến tĩnh hoạt động Primitive Wrapper nhưng không phải với kiểu nguyên thủy
tôi có dưới đây làm việc mã
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class Main {
public static final Integer FLAG = 44;
static void setFinalStatic(Class<?> clazz, String fieldName, Object newValue) throws NoSuchFieldException, IllegalAccessException {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
Field modifiers = field.getClass().getDeclaredField("modifiers");
modifiers.setAccessible(true);
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
public static void main(String... args) throws Exception {
System.out.printf("Everything is %s%n", FLAG);
setFinalStatic(Main.class, "FLAG", 33);
System.out.printf("Everything is %s%n", FLAG);
}
}
Nếu tôi chạy ở trên, tôi nhận được sau đầu ra:
Everything is 44
Everything is 33
Nhưng nếu tôi thay đổi FLAG
biến int tức
public static final int FLAG = 44;
Nó không hoạt động. Đầu ra là:
Everything is 44
Everything is 44
Có cách nào khác để làm cho nó làm việc với Primitive
Loại int
.
Tại sao bạn khai báo biến cuối cùng nếu bạn muốn thay đổi? Xóa cuối cùng. – mvmn
+1 vào nhận xét ở trên. Câu trả lời dễ dàng là int là không thể thay đổi, nhưng tôi không biết đủ java sâu để trả lời với sự tự tin –
hằng số thời gian biên dịch được nội tuyến. Nếu giá trị không được biết cho đến khi chạy, nó có thể được thay đổi. Lưu ý: thay đổi biến 'final' chắc chắn gây nhầm lẫn, do đó bạn sẽ không thực sự làm điều này trong sản xuất. –