2015-10-16 24 views
8

Các vấn đề tiềm năng mà tôi cần phải tìm ra khi sử dụng phản chiếu là gì. Tôi rất bối rối khi phản ánh, Tại sao java cung cấp loại chức năng này để truy cập thành viên dữ liệu cá nhân.Riêng tư là Riêng tư, vậy tại sao java cung cấp cơ sở để truy cập phương thức riêng tư bằng cách sử dụng sự phản chiếu?

Riêng tư: Như tôi nghĩ, chỉ có lớp được khai báo mới có thể nhìn thấy.

Sau đó, tại sao có thể truy cập những thứ riêng tư trong lớp khác? thuật ngữ này (phản ánh) hoàn toàn tràn khái niệm của tôi về thuộc tính riêng (Access Specifier) ​​trong java.

Tôi đã truy cập nhiều liên kết về chủ đề này nhưng không được giải thích đầy đủ về chủ đề này. ví dụ:

package example; 

import java.lang.reflect.Method; 

class A{ 
    private void privateMethod(){ 
     System.out.println("hello privateMethod()"); 
    } 
} 
class B{ 
    public static void main(String[] args) throws Exception { 
     A d = new A(); 
     Method m = A.class.getDeclaredMethod("privateMethod");  
     m.setAccessible(true); 
     m.invoke(d); 
    } 
} 

Vì vậy, hãy giải thích kịch bản về cách tiếp cận này theo chiều sâu? Tôi cần lợi thế và bất lợi của phương pháp tiếp cận tư nhân trong các lớp học khác?

+11

http://stackoverflow.com/questions/1239581/why-is-it-allowed-to-access-java-private-fields-via-reflection –

+1

Hầu hết các dự án thông thường không cần bất kỳ sự phản ánh nào, vì nếu bạn bạn chỉ cần suy nghĩ lại về kiến ​​trúc của mình (có tất nhiên là có ngoại lệ). Một nơi mà tôi thường xuyên sử dụng sự phản chiếu mặc dù là trong UnitTests. Bạn có thể chỉ cần thử nhiều kịch bản bằng cách thay đổi một trường riêng bằng cách sử dụng sự phản chiếu trong UnitTests. Ví dụ như một boolean. Giả sử bạn có một thiết lập boolean và bạn muốn thử nghiệm cả hai kịch bản trong một UnitTest. Mặc định trong dự án của bạn là sai, vì vậy trước tiên bạn thử nghiệm điều đó. Và sau đó bạn sử dụng sự phản chiếu để đặt nó (tạm thời) vào đúng và kiểm tra kịch bản khác. –

+0

có thể giải thích bằng ví dụ nào không? bởi vì nó sẽ rất rõ ràng về khái niệm của tôi. –

Trả lời

1

Tất cả "Riêng tư" và các biểu mẫu khai báo khác là cờ cho công cụ phát triển để biết cách bạn định sử dụng trường hoặc phương thức được đề cập. Điều này là để công cụ phát triển có thể đưa ra cảnh báo hoặc lỗi cho nhà phát triển khi họ sử dụng các lớp/trường/phương pháp này theo cách mà chúng không được dự định.

Phản ánh là công cụ cho phép nhà phát triển bỏ qua hoặc phá vỡ những lá cờ này cho biết rằng bạn đang sử dụng lớp/trường/phương pháp theo cách không bao giờ được dự định. Vì vậy, trong phản ánh chung cho thấy kiến ​​trúc xấu.

Vì vậy, không có "lợi thế hoặc bất lợi" để khai báo một điều gì đó là riêng tư hoặc công khai hoặc tĩnh; chúng chỉ đơn giản là các công cụ giúp giữ mã của bạn sạch sẽ và ngăn cách bởi chỉ cho phép các nhà phát triển truy cập/sử dụng các lớp/trường/phương thức của bạn theo những cách cụ thể.

+3

Điều này không đúng. JVM sẽ thực thi khả năng truy cập (vô hiệu hóa các giải pháp phản xạ) khi có một trình quản lý bảo mật. Để nói rằng đây là "chỉ" một gợi ý biên dịch là sai; chỉ là người quản lý bảo mật không được kích hoạt theo mặc định (và xây dựng một ứng dụng với sự hiện diện của SM thì khó hơn). Các tính năng phản chiếu này được sử dụng bởi một số khung công tác rất hữu ích, chẳng hạn như các khung công tác giống như tuần tự hóa, bộ nhớ cache đối tượng phân tán, khung công tác bền vững và khung mocking. –

1

Trong hầu hết các trường hợp, các công cụ sửa đổi truy cập có nghĩa là giúp giữ các phần của mã mà bạn không muốn mọi người ràng buộc không xem được. Khả năng truy cập các phương thức riêng bằng cách sử dụng sự phản chiếu có thể hữu ích từ góc độ dụng cụ. Java có cơ chế bảo mật cho phép tắt tính năng này. site có một số thông tin về mô hình bảo mật java liên quan đến sự phản chiếu (dưới cùng của trang.)

Điều này thực sự chỉ xảy ra trong trường hợp mã của bạn sẽ thực thi với mã không đáng tin cậy. Nếu các nhà phát triển khác có quyền truy cập vào mã của bạn hoặc có thư viện của bạn, bạn không thể làm gì để ngăn họ chạy mã mà không có trình quản lý bảo mật hoặc thay đổi công cụ sửa đổi, cho vấn đề đó. Điều này chỉ có hiệu quả trong một môi trường được kiểm soát.

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