Запустите метод Java пользователя для сетевого сообщения - PullRequest
1 голос
/ 09 июля 2009

Я могу сделать это на C ++ и Python, но я не совсем понял это на Java.

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

Ответы [ 4 ]

2 голосов
/ 09 июля 2009

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

Непонятно, что вы на самом деле спрашиваете или какие у вас проблемы. Это с дизайном или с фактической загрузкой классов, написанных пользователем, или с динамической конфигурацией пользовательских классов, или с чем-то еще?

1 голос
/ 09 июля 2009

Самый простой способ - создать интерфейс, который определяет вызываемый метод. Таким образом, вы всегда можете запустить метод через Reflection (так как вы знаете имя метода).

То, о чем вы говорите, называется «eval», а Java не имеет возможности выполнять eval, как функциональный язык.

Глупый пример с использованием отражения:

         String classname = "MyClass";
     Class klass = Class.forName(classname);
     Class paramTypes[] = {Integer.TYPE, Float.TYPE};
     Method method = klass.getMethod("methodToRun", paramTypes);
     method.invoke(new Integer(1), new Float(1.2f));
0 голосов
/ 09 июля 2009

Есть несколько способов подойти к этому. Более традиционный способ Java состоит не в том, чтобы передавать произвольный метод, а в определенном интерфейсе с определением метода. Таким образом, ваш класс получает реализацию интерфейса и вызывает метод объекта.

Другой способ - передать объект Method вместе с экземпляром объекта, для которого должен вызываться метод. Это прекрасно работает, если вы не сериализуете (так как метод не сериализуем), но не будет таким элегантным, как в других языках. Конечно, вы могли бы создать свой собственный класс-обертку, который содержал бы метод и экземпляр, но затем вы снова вернулись к тому же решению типа интерфейса.

0 голосов
/ 09 июля 2009

Звучит так, будто вы ищете функциональность "Закрытие", другими словами, возможность передавать функцию как переменную.

http://en.wikipedia.org/wiki/Closure_(computer_science)

В настоящее время в Java этого нет, хотя есть предложения добавить его в Java 7.

До этого вы могли бы передать пользователю реализацию java.util.Callable, который в основном является классом-оболочкой для одного метода.

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