вызов нумерованного имени функции в цикле с использованием отражения Java

#java #function #reflection #numbered

#java #функция #отражение

Вопрос:

у меня проблема в том, что: MyFirstClass.java

 public class MyFirstClass{
  String strParam;
  MySecondClass secClass;
  //getters and setters
}
  

MySecondClass.java

 public class MySecondClass{
  String p1Param;
  String p2Param;
  String p3Param;
  String p4Param;
//setters and getters
}
  

TestClass.java

 public void doProcessing(MyFirstClass pObj){
  for(int i=0;i<3;i  ){
  System.out.println() ;
  //###question is here
}
  

Я хочу использовать отражение Java и вызывать методы pObj.getP **Param() в цикле for, предоставляя параметры g

 Method m= cls.getMethod("getP" (i 1) "Param");
pObj.getSecClass.[ invokeMethod m ]
  

Как это можно сделать возможным.
Я не хочу использовать массив параметров p *.

Заранее спасибо.

Ответ №1:

Вы уверены, что это то, что вам нужно? Для меня ваш код кажется типичным примером текущей тенденции злоупотребления отражением для каждой задачи. Почему вы не используете массивы или карты для хранения свойств p[0-9] Param .

Массивы были изобретены именно для этого. Они предоставляют диапазон переменных, проиндексированных числами.

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

1. @gt_ebuddy: Затем избавьтесь от кода отражения, имитирующего массивы.

Ответ №2:

Вы почти на месте. Как только у вас будет Method объект, просто вызовите его следующим образом:

 String param = (String) m.invoke(pObj.getSecClass());
  

Обратите внимание, что такие игры с отражением могут привести к трудному для понимания и сложному коду, который может быть трудно поддерживать. Если бы вы сказали нам, что представляют нумерованные параметры, тогда мы могли бы предложить лучшее решение (возможно, один параметр, который является List<String> ?).

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

1. спасибо за ответ, да, очевидно, что список<String> — хороший вариант. Приведенный выше вопрос

2. Да, очевидно, что список<String> является хорошим вариантом. Я просто подумал о том, чтобы сделать то же самое, используя отражение, и получил согласие и задал вопрос. спасибо за ответ…

3. <<я нажал клавишу ВВОДА, чтобы создать новую строку, но кнопка добавления комментария была нажата.>>

Ответ №3:

Вот так:

 Object result = m.invoke(pObj.getSecClass)