Есть несколько способов решения этой проблемы. Большинство из них уже опубликовано:
- Команды - Хранить на карте несколько объектов, у которых есть метод execute () или invoke (); найдите команду по имени, затем вызовите метод.
- Полиморфизм - В более широком смысле, чем команды, вы можете вызывать методы для любого связанного набора объектов.
- Наконец, есть отражение - вы можете использовать отражение, чтобы получить ссылки на объекты java.lang.Method. Для набора известных классов / методов это работает довольно хорошо, и при загрузке объектов Method не возникает слишком много накладных расходов. Вы можете использовать это, например, чтобы позволить пользователю вводить код Java в командную строку, которую вы выполняете в реальном времени.
Лично я бы использовал командный подход. Команды хорошо сочетаются с Методы шаблонов , что позволяет вам применять определенные шаблоны для всех ваших объектов команд. Пример:
public abstract class Command {
public final Object execute(Map<String, Object> args) {
// do permission checking here or transaction management
Object retval = doExecute(args);
// do logging, cleanup, caching, etc here
return retval;
}
// subclasses override this to do the real work
protected abstract Object doExecute(Map<String, Object> args);
}
Я бы прибегнул к рефлексии только тогда, когда вам нужно использовать этот вид отображения для классов, дизайн которых вы не контролируете, и для которых нецелесообразно создавать команды. Например, вы не можете представить Java API в командной оболочке, выполнив команды для каждого метода.