2009-11-20 29 views
28

Tôi đang cố gắng viết một phương thức sẽ nhận được một trường riêng tư trong một lớp bằng cách sử dụng sự phản chiếu.Truy cập các biến riêng tư trong Java thông qua sự phản chiếu

Đây là lớp học của tôi (đơn giản hóa ví dụ này):

public class SomeClass { 
    private int myField; 

    public SomeClass() { 
     myField = 42; 
    } 

    public static Object getInstanceField(Object instance, String fieldName) throws Throwable { 
     Field field = instance.getClass().getDeclaredField(fieldName); 
     return field.get(instance); 
    } 
} 

Vì vậy, nói rằng tôi làm điều này:

SomeClass c = new SomeClass(); 
Object val = SomeClass.getInstanceField(c, "myField"); 

tôi nhận được một IllegalAccessExceptionmyField là tư nhân. Có cách nào để có được/đặt biến riêng sử dụng sự phản chiếu? (Tôi đã thực hiện nó trong C#, nhưng đây là lần đầu tiên tôi đã thử nó trong Java). Nếu bạn tự hỏi tại sao có nhu cầu làm như vậy điên rồ :), đó là bởi vì đôi khi trong thử nghiệm đơn vị nó tiện dụng để thiết lập biến tư nhân để giá trị không có thật cho thử nghiệm thất bại, v.v.

Trả lời

32

Đã tìm ra. Cần

field.setAccessible(true); 
+3

nhớ rằng điều này sẽ không hoạt động nếu có PermissionManager – Bozho

+0

này có thể cải thiện hiệu suất nhẹ ngay cả khi thành viên là khác truy cập (khi nó quay kiểm tra off) –

+0

1 này chỉ cứu tôi một số thất vọng :) –

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