2013-04-26 24 views
6

Tôi rất mới trong Reflection và tôi có một nghi ngờ như:
Lý do đằng sau phương thức setAccessible của lớp AccessibleObject có tham số boolean là gì?

public void setAccessible(boolean flag) throws SecurityException 

Phương pháp này có một lá cờ boolen tham số, mà chỉ ra khả năng tiếp cận mới của bất kỳ lĩnh vực hoặc các phương pháp.
Đối với một ví dụ nếu chúng ta cố gắng truy cập vào một phương pháp private của một lớp từ bên ngoài lớp sau đó chúng tôi lấy phương pháp sử dụng getDeclaredMethod và thiết lập khả năng tiếp cận như true, vì vậy nó có thể được gọi, như: method.setAccessible(true);
Bây giờ, trong đó kịch bản chúng ta nên sử dụng method.setAccessible(false);, ví dụ: nó có thể được sử dụng khi có phương thức public và chúng tôi đặt khả năng truy cập là sai. Nhưng nhu cầu đó là gì? Sự hiểu biết của tôi có rõ ràng không?
Nếu không có sử dụng method.setAccessible(false) sau đó chúng ta có thể thay đổi chữ ký phương pháp như:

public void setAccessible() throws SecurityException 
+1

Bạn không muốn rời khỏi mã theo phản ánh trong một trạng thái mà các lập trình viên của mã ** không có ý định ** . Bạn có? Bạn đã sử dụng sự phản chiếu để _unlock_ một đoạn mã để kiểm tra, bạn có muốn để nó _unlocked_ sau đó không? –

+0

Yup. có quan điểm của bạn. –

+0

Downvoater bạn có thể đặt chú thích để tôi có thể cải thiện câu hỏi của mình .. –

Trả lời

5

Kịch bản: bạn loại bỏ bảo vệ từ một lĩnh vực riêng với Field.setAccessible(true), đọc nó và trở về lĩnh vực này vào tình trạng ban đầu với Field.setAccessible(false).

+9

bạn có thể làm điều này nhưng điều đó không có tác dụng vì bạn không bảo vệ sự truy cập bằng cách đặt nó thành false một lần nữa. và sử dụng setAccessible (true) một lần nữa để sử dụng trường. Hơn nữa setAccessible không vĩnh viễn làm thay đổi khả năng truy cập của trường cũng như cách không phản chiếu, để bạn có thể bảo vệ nó khỏi khách hàng bằng cách sử dụng trường theo cách KHÔNG PHẢN LỰC .. – mickeymoon

+0

Đồng ý, nhưng chúng tôi luôn phải làm điều này. Không ai sẽ chuyển giá trị 'false' ở đây. Vậy tại sao ngay cả bận tâm để viết thêm một dòng mã? – Dennis

14

Có thể bạn sẽ không bao giờ làm setAccessible(false) trong toàn bộ cuộc đời của mình. Điều này là do setAccessible không thay đổi độ nhớt của một thành viên vĩnh viễn. Khi bạn vào một cái gì đó như method.setAccessible(true), bạn được phép thực hiện các cuộc gọi tiếp theo trên trường hợpmethod này ngay cả khi phương pháp trong nguồn ban đầu là riêng.

Ví dụ xem xét việc này:

A.java 
******* 
public class A 
{ 
    private void fun(){ 
    .... 
    } 
} 

B.java 
*********** 
public class B{ 

    public void someMeth(){ 
     Class clz = A.class; 
     String funMethod = "fun"; 

     Method method = clz.getDeclaredMethod(funMethod); 
     method.setAccessible(true); 

     method.invoke(); //You can do this, perfectly legal; 

     /** but you cannot do this(below), because fun method's visibilty has been 
      turned on public only for the method instance obtained above **/ 

     new A().fun(); //wrong, compilation error 

     /**now you may want to re-switch the visibility to of fun() on method 
      instance to private so you can use the below line**/ 

     method.setAccessible(false); 

     /** but doing so doesn't make much effect **/ 

    } 

}

+0

Cảm ơn câu trả lời của bạn. –

+0

bạn được chào đón :) – mickeymoon

0
//create class PrivateVarTest { private abc =5; and private getA() {sop()}} 


import java.lang.reflect.Field; 
import java.lang.reflect.Method; 

public class PrivateVariableAcc { 

public static void main(String[] args) throws Exception { 
    PrivateVarTest myClass = new PrivateVarTest(); 

    Field field1 = myClass.getClass().getDeclaredField("a"); 

    field1.setAccessible(true); 

    System.out.println("This is access the private field-" 
      + field1.get(myClass)); 

    Method mm = myClass.getClass().getDeclaredMethod("getA"); 

    mm.setAccessible(true); 
    System.out.println("This is calling the private method-" 
      + mm.invoke(myClass, null)); 

} 

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