【问题标题】:Commands and Java reflection命令和 Java 反射
【发布时间】: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


【解决方案1】:

问题是我传递了一个包含 X 个对象的数组,而不是一个包含对象数组的数组。改变 for 条件有助于。

public static void main(String[] args){
    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};

    int i = 0;
    for(Object obj : argsArray){
        i++;
        if(i != 0){
            argsArray[0][i] = command[i];
        }
    }



    invokeMethod(null, commandListOutput[numbOfArgs], "command", argsArrayClasses, argsArray);
    scanner.close();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多