尝试使用反射调用方法并自动解析输入

时间:2011-07-14 17:32:52

标签: java reflection

我正在尝试允许用户使用套接字和反射来调用服务器上的任何方法。客户端已经知道方法名称和参数数量,但不知道实际的参数类型。

服务器上的每个方法都需要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 个答案:

答案 0 :(得分:2)

当您遍历参数类型时,请检查类名并相应地解析它。

                    for ( Class<?> c : paramTypes )
                            if ( "int".equals(c.getSimpleName() ) {
                                  // parse int
                            }
                            else if ("boolean".equals(c.getSimpleName() ) {
                                  // parse boolean
                            }
                     }

答案 1 :(得分:0)

如果传入字符串中指示的方法通过反射解析为一个方法,则服务器可以确定地获取方法调用的参数类型,并将每个传入的String解析为正确的类型。重载方法可能有点麻烦:验证传入字符串是否可解析为参数类型可能能够找出正确的方法。如果没有,那么应该进行适当的错误处理或报告。