2011-12-23 30 views
7

Tôi đang sử dụng java. Tôi biết bằng cách sử dụng riêng tư sửa đổi truy cập riêng chúng tôi có thể hạn chế. Nhưng sử dụng API phản chiếu tôi vẫn có thể truy cập biến bên ngoài lớp học. Sau đó, việc sử dụng công cụ sửa đổi riêng tư ở đây là gì?cách hạn chế biến không truy cập bên ngoài lớp trong java?

+0

Theo mặc định, bạn có thể truy cập các trường riêng tư thông qua phản ánh không? –

+0

Có. Và tôi không nghĩ rằng có một cách đơn giản để nói với Java "không có sự phản ánh trên các lĩnh vực riêng của tôi". – user949300

Trả lời

2

Vì phản xạ ngắt đóng gói. Bạn có thể ngăn chặn việc sử dụng api phản chiếu nếu ứng dụng của bạn đang chạy trong môi trường được quản lý bảo mật. Xem Java Security Manager

8

private ngăn bạn truy cập từ các lớp khác bằng Java. Tuy nhiên, sử dụng JNI hoặc một thư viện, bạn có thể làm những việc khác nhau. Bạn có thể ngăn phản chiếu bằng trình quản lý bảo mật nhưng điều này hiếm khi cần thiết.

Lưu ý: một số thư viện như Tuần tự hóa cần có thể truy cập các trường riêng tư để hoạt động.

+0

+1. Với OP, xin lưu ý rằng việc ngăn chặn sự phản chiếu sẽ phá vỡ khả năng tương tác của bạn với nhiều thư viện Java mà bạn có thể muốn sử dụng. – Perception

+0

@Perception và một số thứ mà thư viện làm với sự phản chiếu (tạo các hàm tạo không có arg) không tồn tại, do đó phá vỡ cuối cùng, v.v.) là những thay đổi cực kỳ tiềm ẩn trong mã của bạn. Rất nhiều lần tôi chỉ nhắm mắt lại và cầu nguyện rằng họ đang làm đúng. :-) – user949300

+0

@ user949300 - chắc chắn. Mặc dù, bạn có thể tưởng tượng một thư viện như Hibernate trông như thế nào nếu không có khả năng phản ánh và các lớp kỹ sư byte? – Perception

1

sau đó việc sử dụng các modifier tin đây

Các modifier private không phải là một cơ chế bảo mật là gì; nó là (một phần của) một cơ chế đóng gói. Ẩn nội bộ của đối tượng khỏi tiêu thụ công cộng giúp giữ cho các đối tượng ở trạng thái phù hợp, có thể sử dụng, đồng thời cung cấp bình luận về những phần của đối tượng soạn giao diện công cộng (và có thể dựa vào việc không thay đổi).

Chắc chắn, người dùng có thể sử dụng phản chiếu để truy cập dữ liệu trong các trường private, nhưng họ sẽ biết họ đang làm điều gì đó không được thư viện hỗ trợ.

0

Tôi không có chuyên gia về công cụ bảo mật java, nhưng tôi nghĩ bạn phải cung cấp SecurityManager của riêng bạn và ghi đè kiểm traMemberAccess(). ví dụ: để ngăn chặn tất cả phản ánh

public void checkMemberAccess(Class<?> clazz, int which) throws AccessControlException { 

     if (which != Member.PUBLIC) { 
      throw new AccessControlException("No reflection on non-public fields allowed"); 
     } 
    } 

Rõ ràng, trong thế giới thực, bạn có thể muốn kiểm tra chỉ là một tập hợp con nào đó của các lớp học "quan trọng" trong đối số đầu tiên. Và, như đã lưu ý trong nhiều phản hồi khác, điều này sẽ gây ra sự cố cho rất nhiều thư viện của bên thứ ba.

Các vấn đề liên quan