Java, используйте класс, основанный на строковом вводе - PullRequest
1 голос
/ 26 марта 2012

Я делаю инструмент на основе командной строки в Java, и я подумал, что мог бы сделать все это сам по себе, если бы мог принимать пользовательский ввод и автоматически находить необходимые функции на основе пользователейinput.

Что я хочу сделать, так это то, что если пользователь вводит:

User create newUser

Java-код ищет классвызываемый пользователь, затем ищет функцию с именем create и вводит newUser в качестве первого аргумента функции.Это означает, что ввод команды "User create newUser" приведёт к тому, что java-код вызовет следующую строку кода:

User.create("newUser");

И, конечно, вернет ошибки, если класс или функция не найдены, или около того.

До сих пор я играл с

Class.forName(cmdArg[0])

Где cmdArg [0] - это первое слово, данное сканером, найденное путем разбиения там, где есть пробелы.

В любом случае, этоВозможно ли достичь этого на Java?Любая помощь будет принята с благодарностью.


Мое решение:

Хорошо, я получил его, мое окончательное решение было комбинацией ответа duffymo и user978548, мое решение выглядит так:

Class comArgs[] = new Class[1];
comArgs[0] = String.class;

String[] args = new String[1];
args[0] = commandArray[2];

Class.forName("code."+commandArray[0])
    .getDeclaredMethod(commandArray[1], comArgs)
    .invoke(null, args);

Это окружено try / catch с множеством исключений, но оно работает.

У меня также есть HashMap, для которого я хочу получать команды.

Переменная args может содержать столько аргументов, сколько необходимо для вызываемого метода.

Ответы [ 4 ]

3 голосов
/ 26 марта 2012

Вы можете использовать функции, встроенные в класс java.lang.Class:

Class.forName(args[0]).newInstance();

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

Другой подход заключается в размещении экземпляров класса, которые вы хотите, чтобы пользователи могли создавать, на карте, и чтобы они вводили ключ.

2 голосов
/ 26 марта 2012

как сказал Даффимо, Class.forName(args[0]).newInstance(); для класса, и, как сказал Чин Бун, у вас есть все, что вы хотите в методе отражений.Мол, чтобы запустить ваш метод: Object.class.getMethods()[find your method here].invoke(obj, args)

1 голос
/ 26 марта 2012

То, что вы ищете, это отражение Java.

0 голосов
/ 26 марта 2012

Даффимо правильно - отражение - это то, о чем вы, вероятно, говорите.

Тем не менее, я мог бы предложить рассмотреть комбинацию шаблонов проектирования Builder / Factory, чтобы сделать это немного лучше, а не использовать отражение, чтобы попытаться найти нужный класс / методы (хотя, очевидно, это зависит от контекста проблемы). и я делаю некоторые предположения здесь!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...