【发布时间】:2014-04-24 22:49:07
【问题描述】:
我以命令Command arg args 的形式获取输入,然后从Hashtable 获取命令名称,并使用返回的String[] 中的变量并使用反射调用方法。
但我得到了一个我会遇到的错误。
代码: 公共静态无效主要(字符串[]参数){ Boot.boot();
Scanner scanner = new Scanner(System.in);
String[] command = scanner.nextLine().trim().split(" ");
String[] commandListOutput = Boot.command.commands.get(command[0]);
int numbOfArgs = commandListOutput.length - 1;
Object[][] argsArray = new String[1][numbOfArgs];
Class<?>[] argsArrayClasses = new Class<?>[]{Object[].class};
for(int i = 0; i > numbOfArgs; i++){
if(i != 0){
argsArray[0][i] = command[i];
}
}
invokeMethod(commandListOutput[numbOfArgs], "command", argsArrayClasses, argsArray[0]);
scanner.close();
}
输入:
newcommand foo bar
错误:
java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.cjcl.Main.invokeMethod(Main.java:39)
at com.cjcl.Main.main(Main.java:27)
调用方法:
public static void invokeMethod(String className, String methodName,
Class<?>[] paramTypes, Object[] params) {
try {
Class<?> commandclass = Class.forName(className);
Method method = commandclass.getMethod(methodName, paramTypes);
method.invoke(method, params);
} catch (NoSuchMethodException | SecurityException
| ClassNotFoundException | IllegalAccessException
| IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
}
方法(我还没有写它用于调试):
public static void command(Object[] foo){
System.out.println("invoked");
}
我已经尝试了一切,这是我的最终代码。
感谢卷曲
【问题讨论】:
-
什么是
invokeMethod?您要调用的方法是什么?它有哪些参数? -
invokeMethod();是反思的方法。该方法称为命令,它有 1 个 Object[] 作为参数。
-
向我们展示代码。告诉我们你如何称呼
invoke。 -
您似乎正在调用
Method实例上的方法。这就是你想要做的吗? -
Method#invoke的第一个参数应该是调用方法的对象。目前,您将Method对象作为调用方法的对象传递。
标签: java reflection