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?
Trả lời
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
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.
+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
@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
@ 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
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ợ.
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.
- 1. biến truy cập của lớp bên ngoài trong Java
- 2. truy cập vào biến trong lớp bên trong trong java
- 3. Lớp bên trong truy cập lớp bên ngoài
- 4. Truy cập lớp ngoài "siêu" từ lớp bên trong trong Java
- 5. Cách java thực hiện truy cập vào lớp bao ngoài từ một lớp bên trong bên trong?
- 6. Truy cập biến trong phạm vi bên ngoài?
- 7. Truy cập Javascript lớp biến bên trong một hàm lớp
- 8. truy cập phương thức lớp học bên trong java
- 9. làm thế nào để truy cập vào một biến của lớp bên ngoài từ lớp bên trong ruby
- 10. Java: Hạn chế truy cập được bảo vệ cho lớp con trên đối tượng siêu lớp
- 11. truy cập bên ngoài biến $ (document) .ready() & jquery
- 12. Truy cập biến phạm vi bên ngoài Javascript
- 13. bên trong truy cập lớp phương pháp lớp bên ngoài, cùng một phương pháp tên
- 14. Hàm bên trong không thể truy cập biến chức năng bên ngoài
- 15. lớp bạn bè với quyền truy cập hạn chế
- 16. Truy cập các tệp lớp PHP bên ngoài DOCUMENT_ROOT
- 17. lỗi mod_wsgi - lớp .__ dict__ không thể truy cập trong chế độ hạn chế
- 18. Biến truy cập bên ngoài phạm vi chức năng
- 19. Truy cập biến toàn cầu từ bên trong một lớp
- 20. Truy cập các biến từ lớp bên trong
- 21. Truy cập biến thành viên được bảo vệ bên ngoài một lớp học
- 22. Truy cập phạm vi bên ngoài trong Python 2.6
- 23. Truy cập biến ngoài câu lệnh 'if'
- 24. Tôi có thể truy cập các đối tượng lớp ngoài trong lớp bên trong
- 25. Cách truy cập phiên trong diễn đạt, bên ngoài req?
- 26. Truy cập các biến lớp kế thừa trong java
- 27. Truy cập trường ngoài của lớp ẩn danh từ một lớp ẩn danh bên trong
- 28. truy cập xampp/htdocs từ bên ngoài
- 29. Có thể truy cập biến cục bộ bên ngoài trong PHP không?
- 30. Github hạn chế quyền truy cập
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? –
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