私はこのラインでNoSuchMethodException
を得続ける:NoSuchMethodExceptionが表示されるのはなぜですか?
new SubChange("first", physio, "calcTotalFatigue")
どこphysio
:そのインスタンスのように初期化されている
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
}
:sc
はクラスSubChange
のインスタンスである
float modif = (float)sc.affectingObject.getClass().getMethod(sc.affectingMethodName, (Class<?>[])null).invoke(sc.affectingObject, (Object[])null);
内部クラスPhysiology
所属のインスタンスです。クラスHm
に、SubChange
コンストラクタは同じHm
クラスの別の内部クラスから呼び出されています。
calcTotalFatigue()
のphysio
があることは言うまでもありません。
誰でも、私が間違っていることを提案できますか?
ANSWER
エラーが、私は単純に問題の説明を省略方法calcTotalFatigue()
の間違ったアクセス修飾子によって引き起こされました。メソッドをpublicにすると問題が解決しました。
sc.affectingObject.getClass().getMethod(
sc.affectingMethodName, (Class<?>[]) null)
、それはgetMethod
呼び出しはあなたが要求した方法を見つけることができないことを意味します
ありがとうございます。 'sc.affectingObject.getClass()。getName()'が 'Hm $ Physiology'を返しました ' sc.affectingMethodName.toString'が 'calcTotalFatigue'を返しました そして内部クラス' Physiology '(そのオブジェクトは' physio'です)、メソッド 'calcTotalFatigue'を定義します。 「存在する」とは、「定義された名前の綴りが正しい」という意味でした。 アクセスレベル修飾子を持つものにできますか? – Vic
@Vic重要な追加についてコメントを使用しません。代わりに質問を編集してください。 – Robert
@Robert申し訳ありませんが、問題は解決しました。 – Vic