Как подставить имя метода программно?

103
27 августа 2019, 14:40

Смысл в том, что в зависимости от получаемых методом GET параметрах сервлетом необходимо выполнить тот или иной метод - getN1FromDB, getN2FromDB и т.д.
Можно ли это сделать не применяя if, программно формируя имя метода в этой части кода?

DAOModel model = new DAOModel();
List records = model.getN1FromDB(параметр1, параметр2);
Answer 1

Можно с помощью рефлексии, но она медленная, небезопасная и в целом плохая практика использовать её, если вы не пишите средства разработки или фреймворк.

String methodName = "getN1FromDB";
DAOModel model = new DAOModel();
Method method = model.getClass().getDeclaredMethod(methodName, {String.class, int.class});
List records = (List) method.invoke(model, "Hello", 42);
Answer 2

Да это возможно сделать через рефлексию (Java Reflection), но это будет гораздо запарнее:

DAOModel model = new DAOModel();
String methodName = "getN1FromDB";
java.lang.reflect.Method myNamedMethod;
try {
  myNamedMethod = model.getClass().getMethod(methodName, param1.class, param2.class, ..);
} catch (SecurityException e) { ... }
  catch (NoSuchMethodException e) { ... }

В данном случае параметры необходимы для того, чтобы определить метод, если существуют его переопределения разными параметрами.

Далее вызываете этот метод с помощью метода invoke

try {
 List records = (List) myNamedMethod.invoke(model, параметр1, параметр2);
} catch (IllegalArgumentException e) { ... }
  catch (IllegalAccessException e) { ... }
  catch (InvocationTargetException e) { ... }
READ ALSO
Start/Stop SVG анимация

Start/Stop SVG анимация

Я хотел бы использовать эту красивую SVG-анимацию, размещенную на CodePen, но я не могу понять, как запустить или перезапустить анимацию:

119
Загрузка истории Commet Server

Загрузка истории Commet Server

Где-то со вчерашнего дня в чате на моем сайте, работающем при помощи Commet Server не работает функция

116
Как передать POST в модальное окно?

Как передать POST в модальное окно?

Есть форма с одним полем и модальное окно bootstrap-4Подскажите как передать данные с формы методом POST в модальное окно? Если можно с примером...

123
Выборочное добавление класса через JS

Выборочное добавление класса через JS

Есть аккордеон, пытаюсь добавить к нему стрелки состоянияПри открытой вкладке ей присваивается класс active, далее пробую добавить класс, который...

115