Я четыре метода так создано:Можно ли получить getMethodX с помощью for?
method1();
method2();
method3();
method4();
Могу ли я использовать это, как это?
for (int i = 1; i <= 4; i++) {
method+i+(); // ?
}
Я четыре метода так создано:Можно ли получить getMethodX с помощью for?
method1();
method2();
method3();
method4();
Могу ли я использовать это, как это?
for (int i = 1; i <= 4; i++) {
method+i+(); // ?
}
Вы можете использовать Reflection для этого, но это несколько ужасно.
Class<TheClassThatHasSuchMethods> clazz = this.getClass();
for (int i=0; i < 4; i++) {
Method method = clazz.getMethod("method" + i);
method.invoke(this);
}
Будьте готовы к обработке тонны исключений
Предполагая много вещей: они являются методами экземпляра, общедоступными, и они помещаются в класс, к которому принадлежит это «это». – Claudio
Вы можете использовать отражение. Отражение сложно и плохо работает, поэтому вы должны подумать о том, действительно ли вы действительно хотите продолжить.
Однако, код будет выглядеть
for (int i = 1 ; i <= 4; i++) {
Method method = this.getClass().getDeclaredMethod("method"+i);
method.invoke(this);
}
предполагающего метода не является статичной и определена в текущем классе.
Существует несколько способов сделать это, но в целом это предполагает, что вы неправильно структурировали программу. Вы можете сделать это.
for (int i = 1; i <= n; i++)
getClass().getMethod("method" + i).invoke();
Или у вас может быть длинный метод, который сочетает в себе все необходимые функции.
Альтернатива в Java 8, чтобы сделать это
Runnable[] runs = {
this::methodOne,
this::methodTwo,
this::methodThree,
this::methodFour,
this::methodFive,
this::methodSix };
for (int i = 0; i < n; i++)
runs[i].run();
У меня есть всего 6 методов. Если n = 2, мне нужно запустить 2 метода, если n = 4 4 метода ecc. Это моя проблема. И методы имеют некоторые параметры – pippo15
@ pippo15 Добавили альтернативу, свободную от отражения. –
Это еще не '@ FunctionalInterface' в JDK, кроме« Runnable », чтобы это сделать? –
Если вы используете Java 8, вы можете разместить ссылки на метод в Map
, а затем получить доступ к ним по имени.
Если предположить, что ваши методы в классе, таких, как это:
public class Test
{
public void method1() { System.out.println("Method 1!"); }
public void method2() { System.out.println("Method 2!"); }
public void method3() { System.out.println("Method 3!"); }
public void method4() { System.out.println("Method 4!"); }
}
Ключ имя метода.
Map<String, Runnable> methodMap = new HashMap<String, Runnable>();
Test test = new Test();
methodMap.put("method1", test::method1);
methodMap.put("method2", test::method2);
methodMap.put("method3", test::method3);
methodMap.put("method4", test::method4);
for (int i = 1; i <= 4; i++)
{
String methodName = "method" + i;
Runnable method = methodMap.get(methodName);
method.run();
}
Выход:
Method 1!
Method 2!
Method 3!
Method 4!
Если ваши методы принимают некоторые параметры и/или возвращает значение, то вам необходимо выбрать другой функциональный интерфейс, отличный от Runnable
.
Function
-подобные интерфейсы для принятия параметра и возврата функции.В противном случае вы всегда можете определить свой собственный функциональный интерфейс, который представляет параметры (ы) и возможное возвращаемое значение, соответствующее вашим методам.
Использование шаблона команды и добавление команд в коллекцию может выполнить что-то близкое. – chiaboy
Что должен делать 'метод + i +()'? – WonderWorld
Он пытается вызвать метод с именем «method» + i. Это псевдокод. – Claudio