2011-02-08 29 views
8

Tôi có cấu trúc và lớp học theo gói.Java truy cập tài sản riêng tư qua Reflection

package X 
    Class A 
     private string fieldX; 
     protected string getFieldX(){ return fieldX}; 

package Y 
    Class B extends A 
    Class C extends B 

Tôi có đối tượng ClassC và cố gắng lấy fieldX qua phản xạ.

Class partypes[] = new Class[0]; 
Object arglist[] = new Object[0]; 
Method getContextMethod = ClassC.class.getMethod("getFieldX",partypes); 
String retValue = (string) getContextMethod.invoke(classCInstance, arglist); 

Nhưng tôi nhận được ngoại lệ NoSuchMethod.

Tôi cũng đã cố gắng truy cập trực tiếp vào trườngX. Nhưng lần này tôi nhận được ngoại lệ NoSuchField.

Field reqField = ClassC.class.getDeclaredField("fieldX"); 
reqField.setAccessible(true); 
Object value = reqField.get(classCInstance); 
String retValue = (string) value; 

Tôi đang làm gì sai? Có cách nào để lấy fieldX này từ đối tượng ClassC không?

Giải pháp: (cảm ơn vz0 rất nhiều cho giải pháp);

Truy cập trực tiếp đến lĩnh vực tư nhân:

Field reqField = ClassA.class.getDeclaredField("fieldX"); 
reqField.setAccessible(true); 
String value = (String)reqField.get(clazzc); 

Method Gọi;

Class partypes[] = new Class[0]; 
Object arglist[] = new Object[0]; 
Method getContextMethod = ClassA.class.getDeclaredMethod("getFieldX",partypes); 
getContextMethod.setAccessible(true); 
System.out.println((String)getContextMethod.invoke(clazzc, arglist)); 

Trả lời

12

Các Class.getMethod gọi là chỉ phương pháp công cộng. Bạn cần phải sử dụng Class.getDeclaredMethod cuộc gọi và sau đó thiết lập các Method.setAccessible tài sản cho đúng:

Class partypes[] = new Class[0]; 
Object arglist[] = new Object[0]; 
Method getContextMethod = ClassA.class.getDeclaredMethod("getFieldX",partypes); 

getContextMethod.setAccessible(true); 

String retValue = (string) getContextMethod.invoke(classCInstance, arglist); 

EDIT: Kể từ khi phương pháp getFieldX được khai báo trên ClassA, bạn cần phải lấy phương pháp từ ClassA và không ClassC. Đối diện với cuộc gọi getMethod, gọi getDeclaredMethod gọi ignores superclasses.

+0

Điều này sẽ không hoạt động vì phương thức này không được khai báo trong 'ClassC'. – BalusC

+0

Typo đã chỉnh sửa, thx. – vz0

+0

Làm rõ thêm. – vz0

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