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));
Đ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
Typo đã chỉnh sửa, thx. – vz0
Làm rõ thêm. – vz0