Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试使用反射调用方法并自动解析输入_Java_Reflection - Fatal编程技术网

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

Java 尝试使用反射调用方法并自动解析输入,java,reflection,Java,Reflection,我试图允许用户使用套接字和反射调用服务器上的任何方法。客户机已经知道方法名称和参数数量,但不知道实际的参数类型 服务器上的每个方法都接受0个或多个基元参数(包括字符串)并返回一个基元。我使用扫描仪从客户机中的用户处获取输入,因此所有内容都是字符串,我使用.split(“”)分隔参数 如何在服务器上将这些字符串自动解析为正确的类型(int、double、boolean、char等) 下面是我目前在服务器上做的事情。 clientOutput和clientInput是套接字上的ObjectOutpu

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

服务器上的每个方法都接受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);
Class[]parameterTypes=m.getParameterTypes();
clientOutput.writeObject(parameterTypes.length);
clientOutput.flush();
Object[]参数=(Object[])clientInput.readObject();
对于(int i=0;i

然后我将结果(一个对象)发送回客户端,客户端将其打印出来。

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

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

                    for ( Class<?> c : paramTypes )
                            if ( "int".equals(c.getSimpleName() ) {
                                  // parse int
                            }
                            else if ("boolean".equals(c.getSimpleName() ) {
                                  // parse boolean
                            }
                     }
for(c类:参数类型)
if(“int”.equals(c.getSimpleName()){
//解析整数
}
else if(“boolean”.equals(c.getSimpleName()){
//解析布尔
}
}

为什么客户端不能知道参数类型?是的,这是个想法,但我如何知道将每个传入字符串解析为什么类型?正如Kal的回答所建议的:paramTypes。那么,类似这样的东西?
if(“int”).equals(parameterTypes[I].getSimpleName())参数[I]=Integer.parseInt(parameters[I].toString();