Chào mọi người!
Trong Java, lập trình viên có thể sử dụng reflect để truy cập, thực thi, hay tạo mới đối tượng kể cả phạm vi truy cập là private. Vậy có cách nào để ngăn chặn việc này lại ko???
Mong mọi người chỉ giáo…
Cách không cho reflect truy cập vào constructor, method, field trong Java
Reflection sinh ra để làm việc đó mà
Mình nghĩ không có cách nào ngăn được đâu
Trừ khi bạn custom lại JDK để xóa cái Reflection đi
(Nhưng hơi khó khăn đấy!)
2 Likes
Giới hạn thì được, chứ 100% thì không được.
Vi dụ ngăn chặn reflection tạo nhiều instance trong singleton partern
public class AppConfig {
private static AppConfig self;
public int appId;
private AppConfig() {
appId = new Random().nextInt(100);
}
public static AppConfig getInstance() {
if (self == null) {
self = new AppConfig();
}
return self;
}
}
Nếu viết như trên, reflection có thể access được
public static void main(String[] args) {
AppConfig config = AppConfig.getInstance();
System.out.println(config.appId);
AppConfig appConfig = null;
try {
Class<AppConfig> clazz = AppConfig.class;
Constructor<AppConfig> constructor = clazz.getDeclaredConstructor();
constructor.setAccessible(true);
appConfig = constructor.newInstance();
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | InstantiationException e) {
e.printStackTrace();
}
System.out.println(appConfig.appId);
}
Đó cũng là cách để destroy singleton.
Muốn ngăn chặn thì kiếm soát việc tạo constructor như dưới:
private AppConfig() {
if (self != null) {
throw new UnsupportedOperationException("Use getInstance() to create object.");
}
appId = new Random().nextInt(100);
}
5 Likes
Cảm ơn anh. Rất bổ ích ạ 
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?