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