调用方法以与阵列参数使用反射(Invoke method with an array paramet

2019-08-21 22:24发布

我试图通过传递一个字符串数组作为参数传递给方法写一个方法执行从另一个类的静态方法。

下面是我有:

public static void
executeStaticCommand(final String[] command, Class<?> provider)
{
    Method[] validMethods = provider.getMethods();

    String javaCommand = TextFormat.toCamelCase(command[0]);

    for (Method method : validMethods) {
        if (method.getName().equals(javaCommand)) {
            try {
                method.invoke(null, new Object[] { new Object[] { command } });
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                Throwable ex = e.getCause();
                ex.printStackTrace();
            }
            break;
        }
    }
}

这样的:

String[] args = new String[] { "methodName", "arg1", "arg2" }; 
executeStaticCommand(args, ClassName.class);

应该执行这样的:

public class ClassName {
    public static void methodName(String[] args) {
        assert args[1].equals("arg1");
    }
}

但是我得到IllegalArgumentException秒。

Answer 1:

你有两个问题:

  1. 目标参数类型String[]但你在路过的Object[]
  2. 你传递整个命令阵列作为参数,其中包括方法名

这些问题都在内部try块,所以我只显示代码。

String[] args = Arrays.copyOfRange(command, 1, command.length - 1);
method.invoke(null, new Object[]{args}); // must prevent expansion into varargs

由于感知提醒我的可变参数问题



Answer 2:

你试图调用的方法是期待String数组,但是你逝去的对象数组作为PARAM。 将其更改为String数组,或者你可以通过任何类型,如果该方法需要对象。

method.invoke(NULL,(对象)命令);



Answer 3:

基于这个问题 ,它看起来像调用应该是

 method.invoke(null, command);


文章来源: Invoke method with an array parameter using reflection