Проблема с nosuchmetodexception с отражением

#java #reflection

#java #отражение

Вопрос:

Итак, у меня есть что-то вроде:

 public abstract class myClass {  
  String myString;
  int test;

  public myClass(String heuristic) {
     mystring = heuristic;
     test = heuristicSwitch();
  }

  public int heuristicSwitch() {
     int hTest = 0;

     try {
        String methodName = "getHeuristic"   myString;
        Method actionMethod = myClass.class.getDeclaredMethod(methodName);
        hTest = (Integer)actionMethod.invoke(this);
     }
     catch(Exception e) {
     }

     return hTest;
  }

  public int getHeuristicManhattan() {
     return 100;
  }
  

}

Я в тупике… Я продолжаю получать NoSuchMethodException , но понятия не имею, почему. Я думал, что проблема могла заключаться в том, что MyClass является абстрактным, поэтому я попробовал это с помощью getClass () и получил то же исключение, поэтому я думаю, что это что-то другое (если только это не находит методы суперкласса?). Мысли?

Ответ №1:

попробуйте использовать getMethod() вместо getDeclaredMethod . первое ограничивает вас конкретным экземпляром класса, второе включает в себя всю иерархию. Кроме того, я предполагаю, что эвристика (например, «Манхэттен») написана с заглавной буквы соответствующим образом?

тем не менее, что-то подобное, вероятно, намного лучше обрабатывается с помощью перечислений и какого-то внутреннего класса strategy. затем вы сопоставляете свои перечисления с соответствующей реализацией стратегии.

Комментарии:

1. Это помогло, спасибо! Я проголосую, как только это позволит мне.

Ответ №2:

Я думаю, что это должно быть:

String methodName = "getHeuristic" mystring;

Но я не знаю, как компилируется ваш. Что это за переменная «эвристическая», которая находится там в области видимости?

Комментарии:

1. np 🙂 кстати, я думаю, это не скомпилировалось бы, если бы вы использовали private поля везде, что, как правило, является хорошей практикой.

Ответ №3:

Я предлагаю вам использовать библиотеку, такую как commons-beanutils, вместо того, чтобы бороться с неприятностями прямого отражения.

Кроме того, в вашем примере кода есть пустой блок catch, которого лучше избегать.

Ответ №4:

Я думаю, проблема в том, что you’re переменная myString установлена не на то, какой она должна быть. Я бы вставил некоторый оператор отладки, чтобы убедиться, что methodName это именно то, что вы думаете, что это должно быть.