Java通过反射访问私有属性

9
我有以下的包结构和类。
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异常。
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个回答

13

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中获取。与getMethod方法调用相反,getDeclaredMethod方法调用忽略超类


感谢vz0的回答。这很有效。还添加了对私有字段的直接访问来回答问题。 - huseyinarslan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接