Trong Java, công cụ private
sửa đổi truy cập được coi là an toàn vì nó không hiển thị bên ngoài lớp. Thế giới bên ngoài cũng không biết về phương pháp đó.
Nhưng tôi nghĩ rằng phản xạ Java có thể sử dụng để phá vỡ quy tắc này. Hãy xem xét trường hợp sau:
public class ProtectedPrivacy{
private String getInfo(){
return "confidential";
}
}
Bây giờ từ một lớp khác, tôi sẽ nhận được Thông tin:
public class BreakPrivacy{
public static void main(String[] args) throws Exception {
ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy();
Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null);
method.setAccessible(true);
Object result = method.invoke(protectedPrivacy);
System.out.println(result.toString());
}
}
Lúc này tôi chỉ nghĩ phương thức private vẫn an toàn vì để làm một số việc như trên chúng ta phải biết tên phương thức. Nhưng nếu lớp có chứa phương thức private được viết bởi một số người khác, chúng ta không có khả năng hiển thị chúng.
Nhưng quan điểm của tôi trở nên không hợp lệ kể từ dòng mã bên dưới.
Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();
Bây giờ nó method[]
chứa tất cả những thứ cần làm ở trên. Câu hỏi của tôi là, có cách nào để tránh những việc này khi sử dụng phản chiếu Java không?
Tôi trích dẫn một số điểm từ Tài liệu Java để làm rõ câu hỏi của tôi.
Mẹo chọn Cấp độ Truy cập:
Nếu các lập trình viên khác sử dụng lớp của bạn, bạn muốn đảm bảo rằng các lỗi do sử dụng sai không thể xảy ra. Các cấp độ truy cập có thể giúp bạn làm điều này. Sử dụng cấp độ truy cập hạn chế nhất phù hợp với một thành viên cụ thể. Sử dụng chế độ riêng tư trừ khi bạn có lý do chính đáng.
getDeclaredMethods
nó sẽ trả về các tên trông giống như rác.