如何重新创建方法调用?当我所得到的是getDeclaredMethods()
得到的方法列表,并将其转换为HashMap<String,Method>
和getParameterTypes()
得到的参数类列表。
假设我从用户那里得到一个字符串,我想调用它:
"print(3,"Hello World!",true,2.4f)"
方法print(int,String,boolean,float)
是getMethods()数组的一部分。我在弄清楚如何编写调用时遇到了麻烦。到目前为止,这是我得到的:
private static final Pattern functionCall = Pattern.compile(String.format("^%s\(%s?\)$", "(\w+)", "(.*)"));
if( (m = functionCall.matcher(line)).find() ) {
String function = m.group(1); // in this example = "print"
String arguments = m.group(2); // in this example = "3,\"Hello World!\",true,2.4f"
if( methods.containsKey(function) ) {
Method method = methods.get(function);
Class<?>[] paramsExpected = method.getParameterTypes();
String [] paramsActual = arguments.split(",");
if( paramsExpected.length != paramsActual.length ) {
throw new IllegalArgumentException(function + ": bad number of arguments");
}
for( Class<?> param: paramsExpected) {
???????
}
method.invoke(context, ??????);
为了完全清楚,我事先不知道用户将输入什么字符串,我必须根据可用的方法及其参数检查它,如果我找到了它,那么我必须使用用户提供的参数调用它。
这就是你需要做的。一种选择是使用ConverterUtils。BeanUtils的convert方法将字符串转换为特定类型的对象。这将适用于内建类型。
Object[] args = new Object[paramsExpected.length];
int i = 0;
for( Class<?> param: paramsExpected) {
args[i] = convertStringToType(paramsActual[i], param);
i = i +1;
}
method.invoke(context, args);
Object convertStringToType(String input, Class<?> type) {
return ConverterUtils.convert(input,type);
}