Invoke method with an array parameter using reflec

2019-02-21 13:08发布

I am attempting to write a method the executes a static method from another class by passing an array of strings as arguments to the method.

Here's what I have:

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;
        }
    }
}

Such that this:

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

Should execute this:

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

However I'm getting IllegalArgumentExceptions.

3条回答
Deceive 欺骗
2楼-- · 2019-02-21 13:25

Based on this question, it looks like the call should be

 method.invoke(null, command);
查看更多
你好瞎i
3楼-- · 2019-02-21 13:32

The method your trying to invoke is expecting String array, however you are passing Object array as param. Change it to String array Or you can pass any type if the method expects Object.

method.invoke(null,(Object) command );

查看更多
走好不送
4楼-- · 2019-02-21 13:36

You have two problems:

  1. The target parameter type is String[], but you're passing in a Object[]
  2. You're passing in the whole command array as arguments, which includes the method name

The problems are all in the inner try block, so I show only that code.

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

Thanks to Perception for reminding me of the varargs issue

查看更多
登录 后发表回答