Как вызвать метод Java, используя имя переменной? - PullRequest
22 голосов
/ 09 ноября 2010

Скажем, у меня есть Method1 (void), Method2 (void) ...

Есть ли способ выбрать один из них с переменной?

 String MyVar=2;
 MethodMyVar();

Ответы [ 4 ]

35 голосов
/ 10 ноября 2010

Использовать отражение:

Method method = WhateverYourClassIs.class.getDeclaredMethod("Method" + MyVar);
method.invoke();
9 голосов
/ 10 ноября 2010

Только через отражение.См. Пакет java.lang.reflect.

Вы можете попробовать что-то вроде:

Method m = obj.getClass().getMethod("methodName" + MyVar);
m.invoke(obj);

Ваш код может отличаться, если у метода есть параметры и отсутствует всякая обработка исключений.

Но спросите себя, действительно ли это необходимо?Можно ли что-то изменить в вашем дизайне, чтобы избежать этого.Код отражения трудно понять, и он медленнее, чем просто позвонить obj.someMethod().

Удачи.Удачного кодирования.

6 голосов
/ 10 ноября 2010

Вы можете использовать шаблон проектирования Стратегии и сопоставление имеющейся строки с соответствующим конкретным объектом стратегии.Это безопасное и эффективное средство.

Итак, ищите HashMap<String,SomeInterfaceYouWantToInvokeSuchAsRunnableWithPseudoClosures>.

Например, что-то в следующем духе:также используйте отражение или «инвертируйте» проблему и используйте полиморфизм

0 голосов
/ 05 июня 2016

Я не уверен, как принятый ответ работает для method.invoke() без первого аргумента статического метода, равного null (хотя фиктивное значение по-прежнему работает).Согласно Учебникам Java ™ :

Первый аргумент - это экземпляр объекта, для которого должен быть вызван этот конкретный метод.(Если метод статический, первый аргумент должен быть нулевым.)

Ниже приведены полные примеры ( Main.java ), для обоих static (byкласс) VS нестатический (по экземпляру) , плюс дополнительный пример для метода с аргументом , import необходимый класс, catch исключение, а также метод суперкласса пример.

import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;

class Love {
   protected void Method4() {
        System.out.println("calls super protected method by instance");
    }

   public void Method5() {
        System.out.println("calls super public method by instance");
    }
}

class Main extends Love {

    static void Method2(int y) {
        System.out.println("by class: " + y);
    }

    void Method3(String y) {
        System.out.println(y);
    }

    public static void main(String[] args) {

        String MyVar = "2";
        String MyAnotherVar = "3";
        String MySuperVar = "4";
        String MySuperPublicMethodVar = "5";
        Main m = new Main();

       try {
            Method method = Main.class.getDeclaredMethod("Method" + MyVar, int.class); //by class
            Method anotherMethod = m.getClass().getDeclaredMethod("Method" + MyAnotherVar, String.class); //by instance
            Method superMethod = m.getClass().getSuperclass().getDeclaredMethod("Method" + MySuperVar); //super method by instance, can be protected
            Method superPublicMethod = m.getClass().getMethod("Method" + MySuperPublicMethodVar); //getMethod() require method defined with public, so even though sublcass calls super protected method will not works
            try {
                method.invoke(null, 10000);//by class
                anotherMethod.invoke(m, "by instance"); //by instance
                superMethod.invoke(m); //super method by instance
                superPublicMethod.invoke(m); //super's public method by instance
            } catch (InvocationTargetException e) {
                throw new RuntimeException(e);
            }

       } catch (NoSuchMethodException e) {
           throw new RuntimeException(e);
       } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
       }
    }
}

Выход:

$ javac Main.java
$ java Main 
by class: 10000
by instance
calls super protected method by instance
calls super public method by instance
$ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...