Могу ли я сохранить имена функций в окончательной хэш-карте для выполнения? - PullRequest
4 голосов
/ 20 ноября 2011

Я создаю контроллер администратора, который работает как эмулятор терминала в Flex 4.5. На стороне сервера Red5 на сервере Tomcat с использованием языка программирования Java.

Когда пользователь вводит команду в своем текстовом вводе, команда отправляется на red5, в red5 я проверяю, существует ли команда, и возвращаю правильный вывод или ошибку, если команда или параметры не совпадают.

так что сейчас я использую if (command.equals("..") {} else if (command.equals(...

Есть ли способ сохранить имя функции или ссылку на функцию, которая должна быть выполнена в каждой команде, и выполнить ее?

пример:

// creating the hasmap
HashMap<String,Object> myfunc = new HashMap<String,Object>();

// adding function reference
myfunc.put("help",executeHelp);

или ....

myfunc.put("help", "executeHelp"); // writing the name of the function

, а затем

void receiveCommand(String command, Object params[]( {
 myfunc.get(command).<somehow execute the referrened function or string name ? >
}

есть идеи?

спасибо!

Ответы [ 3 ]

8 голосов
/ 20 ноября 2011

Вы можете использовать отражение, но я предлагаю более простой способ.

Вы можете создать абстрактный класс или интерфейс с помощью абстрактного метода execute. Пример:

interface Command {
    void execute(Object params[]);
}

class Help implements Command {
    void execute(Object params[]) {
        // do the stuff
    }
}

Теперь ваш hashmap может быть:

// creating the hasmap
HashMap<String,Command> myfunc = new HashMap<String,Command>();

// adding function reference
myfunc.put("help", new Help());

А потом:

void receiveCommand(String command, Object params[]) {
    myfunc.get(command).execute(params);
}
5 голосов
/ 20 ноября 2011

Вы можете выполнить функцию по имени следующим образом:

java.lang.reflect.Method method;
try {
   method = obj.getClass().getMethod(methodName, param1.class, param2.class, ..);
} catch (SecurityException e) {
   // ...
} catch (NoSuchMethodException e) {
   // ...
} 

В приведенном выше фрагменте param1.class, param2.class - это типы классов аргументов метода для выполнения.

Тогда:

try {
   method.invoke(obj, arg1, arg2,...);
}
catch (IllegalArgumentException e) { }
catch (IllegalAccessException e) { } 
catch (InvocationTargetException e) { }

Более подробную информацию можно найти здесь: http://java.sun.com/docs/books/tutorial/reflect/index.html

3 голосов
/ 20 ноября 2011

Вы можете определить интерфейс для своих функций

interface Function {
    public Object invoke(Object[] arguments);
}

, а затем опубликовать ваш код через этот интерфейс

public class Function1 implements Function {
    public Object invoke(Object[] arguments) {
       ...
    }

}

и магазин на карте

map.put("helpCommand", new Function1());

или сохранить ссылку, используя анонимный класс

Function theFunction = new Function() {

    public Object invoke(Object[] arguments) {
        return theRealMethod(arguments[0], String.valueOf(arguments[1]));
    }
}

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

...