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