Java通过Reflection访问私有属性

时间:2011-02-08 15:46:02

标签: java reflection

我有以下包结构和类。

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

package Y
    Class B extends A
    Class C extends B

我有ClassC对象并尝试通过反射获取fieldX。

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

但我得到NoSuchMethod例外。

我试过也直接到达fieldX。但是这次我得到了NoSuchField Exception。

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

我做错了什么? 有没有办法从ClassC对象获取此fieldX?

解决方案:(非常感谢vz0解决方案);

直接访问私有字段:

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

方法调用;

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));

1 个答案:

答案 0 :(得分:12)

Class.getMethod调用仅适用于公共方法。您需要使用Class.getDeclaredMethod调用,然后将Method.setAccessible属性设置为true:

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);

编辑:由于在getFieldX上声明了ClassA方法,因此您需要从ClassA而不是ClassC中获取Method。与getMethod来电相反,getDeclaredMethod来电ignores superclasses