Попытка вызова метода с использованием отражения и автоматического анализа ввода - PullRequest
1 голос
/ 14 июля 2011

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

Каждый метод на сервере принимает 0 или более примитивных аргументов (включая строки) и возвращает примитив. Я принимаю данные от пользователя в клиенте с помощью сканера, поэтому все является строкой, и я использую .split ("") для разделения параметров.

Как автоматически разобрать эти строки в их правильные типы (int, double, boolean, char и т. Д.) На сервере?

Вот что я сейчас делаю на сервере. clientOutput и clientInput - это ObjectOutputStream и ObjectInputStream в сокете, а m - это метод, который я вызываю.

Class<?>[] parameterTypes = m.getParameterTypes();
clientOutput.writeObject(parameterTypes.length);
clientOutput.flush();
Object[] parameters = (Object[]) clientInput.readObject();
for (int i = 0; i < parameterTypes.length; i++) {
    //Some sort of if statement? Some way to handle booleans or chars?
    parameters[i] = NumberFormat.getInstance().parse((String) parameters[i]);
}
result = m.invoke(math, parameters);

И затем я отправляю результат (который является объектом) обратно клиенту, и он распечатывает его.

Ответы [ 2 ]

2 голосов
/ 14 июля 2011

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

                    for ( Class<?> c : paramTypes )
                            if ( "int".equals(c.getSimpleName() ) {
                                  // parse int
                            }
                            else if ("boolean".equals(c.getSimpleName() ) {
                                  // parse boolean
                            }
                     }
0 голосов
/ 14 июля 2011

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

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