#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
это именно то, что вы думаете, что это должно быть.