使用reflection调用带有数组参数的方法

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

这就是我所拥有的:

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

你有两个问题:

  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 

感谢Perception提醒我varargs问题

您尝试调用的方法是期望String数组,但是您将Object数组作为param传递。 将其更改为String数组或者如果方法需要Object,则可以传递任何类型。

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

基于这个问题 ,看起来应该是这样的

  method.invoke(null, command);