как вызвать метод java с использованием имени переменной?

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

Есть ли способ, которым я могу выбрать один из тех, у кого есть переменная?

String MyVar=2; MethodMyVar(); 

Используйте reflection:

 Method method = WhateverYourClassIs.class.getDeclaredMethod("Method" + MyVar); method.invoke(); 

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

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

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

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

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

Удачи. Счастливое кодирование.

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

Итак, HashMap поиск.

Например, что-то вроде:

 final static YourType reciever = this; HashMap m = new HashMap {{ add("a", new Runnable() { @Override public void run () { reciever.a(); } }); .... }}; // but check for range validity, etc. m.get("a").run() 

Вы также можете использовать reflection или «инвертировать» проблему и использовать polymorphism

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

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

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

 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 $ 
  • Объединение переменных имен в C?
  • Как вы знаете переменный тип в java?
  • Java - Включая переменные в строки?
  • Переменные среды в Eclipse
  • Перечислите или перечислите все переменные в программе
  • Сценарий Bash - Как ссылаться на файл для переменных
  • вопрос об области видимости переменной и тени в java
  • Использование переменной в предложении LIMIT в MySQL
  • Переменные delphi инициализируются значением по умолчанию?
  • Возможно, переменная не была инициализирована ошибкой
  • Почему звездочка перед именем переменной, а не после типа?
  • Interesting Posts

    CloudFront + S3 Website: «Указанный ключ не существует», когда должен отображаться неявный индексный документ

    Как запустить хранимые процедуры в Entity Framework Core?

    C #: class для декодирования кодировки с кодовым кодированием?

    Программно выровнять панель инструментов поверх клавиатуры iPhone

    Как имитировать не виртуальные методы?

    Как экспортировать расширения Google Chrome?

    Какие шаблоны проектирования могут быть применены к проблеме настроек конфигурации?

    Почему в Microsoft Excel не работают клавиши со стрелками?

    JsonMappingException: не найдено подходящего конструктора для типа : невозможно создать экземпляр из объекта JSON

    Использование странных меток для условия IF в цикле DO

    C # .NET: получить права администратора?

    Как получить значение ASCII строки в C #

    DD-WRT: как разрешить переадресацию портов применять к запросам, исходящим из локальной сети?

    Chrome изменил разрешение после сбоя

    Вертикально выравнивать текст рядом с изображением?

    Давайте будем гением компьютера.