我试图允许用户使用套接字和反射在服务器上调用任何方法。客户端已经知道方法名称和参数数量,但不知道实际的参数类型。
服务器上的每个方法都接受0个或多个基本参数(包括字符串)并返回一个基本参数。我正在使用Scanner从客户端中的用户获取输入,因此所有内容都是字符串,并且我使用.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);
然后我将结果(这是一个对象)发送回客户端,并将其打印出来。
当您遍历参数类型时,检查类名并相应地解析它。
for ( Class<?> c : paramTypes )
if ( "int".equals(c.getSimpleName() ) {
// parse int
}
else if ("boolean".equals(c.getSimpleName() ) {
// parse boolean
}
}
如果传入字符串中指示的方法通过反射解析为一个方法,则服务器肯定可以获得方法调用的参数类型,并将每个传入字符串解析为正确的类型。重载的方法可能有点麻烦:验证传入的字符串是否可解析,因为参数类型可以挑选出正确的方法。如果没有,则应该进行适当的错误处理或报告。