为什么我会收到NoSuchMethodException?

时间:2016-05-24 07:24:52

标签: java reflection

我一直在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的错误访问修饰符引起的,我在问题描述中天真地省略了它。使方法公开解决了问题。

1 个答案:

答案 0 :(得分:0)

这部分引发了异常:

sc.affectingObject.getClass().getMethod(
        sc.affectingMethodName, (Class<?>[]) null)

这意味着getMethod调用无法找到您请求的方法。

我无法确定查看代码的原因,但我建议您打印出sc.affectingObject.getClass()返回的类的类名,打印出sc.affectingMethodName的值,然后仔细检查实际的类(或超类)定义了您正在寻找的方法。

  

毋庸置疑,physio的方法calcTotalFatigue()存在。

毋庸置疑......你可能错了!

<强>更新

你问:

  

是否可以使用访问级别修饰符?

javadoc说:

  

“返回一个Method对象,该对象反映此Class对象所代表的类或接口的指定 public 成员方法。”

所以......是的,这可能就是问题所在。如果您想要检索非公开方法,请考虑使用getDeclaredMethod代替getMethod