01/10/2018, 16:27

Cách không cho reflect truy cập vào constructor, method, field trong Java

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…

Nguyễn Đình Anh viết 18:34 ngày 01/10/2018

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!)

Nguyen Ca viết 18:43 ngày 01/10/2018

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);
}
Hoang viết 18:40 ngày 01/10/2018

Cảm ơn anh. Rất bổ ích ạ

Bài liên quan
0