#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)