我有以下包结构和类。
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的解决方案);
直接访问私有(private)字段:
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));
最佳答案
Class.getMethod
调用仅用于公共(public)方法。您需要使用 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
调用 ignores superclasses .
关于Java通过反射访问私有(private)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4935136/