我有以下包结构和类.
package X
Class A
private string fieldX;
protected string getFieldX(){ return fieldX};
package Y
Class B extends A
Class C extends B
Run Code Online (Sandbox Code Playgroud)
我有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);
Run Code Online (Sandbox Code Playgroud)
但我得到NoSuchMethod异常.
我试过也直接到达fieldX.但是这次我得到NoSuchField Exception.
Field reqField = ClassC.class.getDeclaredField("fieldX");
reqField.setAccessible(true);
Object value = reqField.get(classCInstance);
String retValue = (string) value;
Run Code Online (Sandbox Code Playgroud)
我做错了什么?有没有办法从ClassC对象获取此fieldX?
解决方案:(非常感谢vz0解决方案);
直接进入私人领域:
Field reqField = ClassA.class.getDeclaredField("fieldX");
reqField.setAccessible(true);
String value = (String)reqField.get(clazzc);
Run Code Online (Sandbox Code Playgroud)
方法调用;
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));
Run Code Online (Sandbox Code Playgroud)
vz0*_*vz0 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);
Run Code Online (Sandbox Code Playgroud)
编辑:由于getFieldX声明了方法ClassA,您需要从ClassA而不是ClassC获取Method.与getMethod调用相反,getDeclaredMethod调用忽略超类.
| 归档时间: |
|
| 查看次数: |
7023 次 |
| 最近记录: |