我一直在NoSuchMethodException
获得此行:
float modif = (float)sc.affectingObject.getClass().getMethod(sc.affectingMethodName, (Class<?>[])null).invoke(sc.affectingObject, (Object[])null);
其中sc
是类SubChange
的实例:
class SubChange implements Serializable {
String changeType;
Serializable affectingObject;
String affectingFieldName;
String affectingMethodName;
public SubChange(String chanType, Serializable affingObj, String affingFM) {
try{
changeType = chanType;
affectingObject = affingObj;
//deciding whether affingFM provides a field name or a method name
for (Field f : affingObj.getClass().getDeclaredFields()) {
if (f.getName().equals(affingFM) == true) {
affectingFieldName = affingFM;
break;
}
}
if (affectingFieldName == null) {
affectingMethodName = affingFM;
}
} catch(Exception e) {
e.printStackTrace();
}
}
//other class methods
}
其实例已初始化为:
new SubChange("first", physio, "calcTotalFatigue")
其中physio
是属于类Physiology
的内部类Hm
的实例,而SubChange
构造函数是从同一{{1}的另一个内部类调用的}。class。
毋庸置疑,Hm
的方法calcTotalFatigue()
已存在。
请允许任何人,建议我做错了吗?
ANSWER
错误是由方法physio
的错误访问修饰符引起的,我在问题描述中天真地省略了它。使方法公开解决了问题。
答案 0 :(得分:0)
这部分引发了异常:
sc.affectingObject.getClass().getMethod(
sc.affectingMethodName, (Class<?>[]) null)
这意味着getMethod
调用无法找到您请求的方法。
我无法确定查看代码的原因,但我建议您打印出sc.affectingObject.getClass()
返回的类的类名,打印出sc.affectingMethodName
的值,然后仔细检查实际的类(或超类)定义了您正在寻找的方法。
毋庸置疑,physio的方法calcTotalFatigue()存在。
毋庸置疑......你可能错了!
<强>更新强>
你问:
是否可以使用访问级别修饰符?
javadoc说:
“返回一个Method对象,该对象反映此Class对象所代表的类或接口的指定 public 成员方法。”
所以......是的,这可能就是问题所在。如果您想要检索非公开方法,请考虑使用getDeclaredMethod
代替getMethod
。