Giả sử tôi có một lớp học:
public class R {
public static final int _1st = 0x334455;
}
Làm cách nào để nhận giá trị của "_1st" thông qua phản xạ?
BR
lớp học.
Giả sử tôi có một lớp học:
public class R {
public static final int _1st = 0x334455;
}
Làm cách nào để nhận giá trị của "_1st" thông qua phản xạ?
BR
lớp học.
Câu trả lời:
Đầu tiên truy xuất thuộc tính trường của lớp, sau đó bạn có thể truy xuất giá trị. Nếu bạn biết kiểu, bạn có thể sử dụng một trong các phương thức get với null (chỉ đối với trường tĩnh, trên thực tế với trường tĩnh, đối số được truyền cho phương thức get sẽ bị bỏ qua hoàn toàn). Nếu không, bạn có thể sử dụng getType và viết một công tắc thích hợp như bên dưới:
Field f = R.class.getField("_1st");
Class<?> t = f.getType();
if(t == int.class){
System.out.println(f.getInt(null));
}else if(t == double.class){
System.out.println(f.getDouble(null));
}...
getInt()
bỏ qua đối số được truyền vào? Đã dành hàng giờ để cố gắng làm cho phiên bản của lớp vượt qua đó.
R.class.getField("_1st").get(null);
Xử lý ngoại lệ được để lại như một bài tập cho người đọc.
Về cơ bản, bạn nhận được trường giống như bất kỳ trường nào khác thông qua phản chiếu, nhưng khi bạn gọi phương thức get, bạn chuyển vào giá trị null vì không có trường hợp nào để hành động.
Điều này hoạt động cho tất cả các trường tĩnh, bất kể chúng là trường cuối cùng. Nếu trường không công khai, bạn cần phải gọi setAccessible(true)
nó trước và tất nhiên SecurityManager phải cho phép tất cả điều này.
Tôi đã đi theo cùng một lộ trình (xem qua lớp R được tạo) và sau đó tôi có cảm giác khủng khiếp rằng nó có thể là một hàm trong lớp Tài nguyên. Tôi đã đúng.
Tìm thấy cái này: Tài nguyên :: getIdentifier
Nghĩ rằng nó có thể giúp mọi người tiết kiệm thời gian. Mặc dù họ nói rằng nó không được khuyến khích trong các tài liệu, điều này không quá ngạc nhiên.
R._1st
không thể hoạt động? Nếu bạn đang nói về phát triển Android, tôi nghĩ rằngR
lớp học luôn ở đó ...