在数组中的参数时调用Method.invoke()

Op *_*kel 3 java reflection variadic-functions

我有以下界面:

interface Foo {
  void bar(String a, int b);
}
Run Code Online (Sandbox Code Playgroud)

我想Foo.bar反思地调用(在Foo的实现上).但是,参数是在数组中,我不知道它的大小.

以下不起作用:

void gee(Foo someFoo, Method bar, Object[] args) {
  bar.invoke(someFoo, args);
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为args编译器将其作为单个参数进行威胁,并且数组不会"扩展"为vararg,而是在一个包含单个元素的数组中(内部)包装,即

@Test
public void varArgTest() {
  assertTrue(varArgFoo(new Object[] {1, 2}) == 1);
}

private static <T> int varArgFoo(T... arg) {
    return arg.length;
}
Run Code Online (Sandbox Code Playgroud)

我如何Method.invoke()在这种情况下调用,以便将数组作为vararg进行威胁?
或者更一般的问题:当参数在数组中时我如何调用vararg方法我不知道数组的大小直到运行时.

Jon*_*eet 10

vararg参数实际上是一个带有一些额外元数据的数组参数.所以当你使用时Method.invoke,你需要将数组包装在另一个数组中:

Object[] varargs = new Object[] { 10, 20 };
Object argumentArray = new Object[] { varargs };
method.invoke(target, argumentArray);
Run Code Online (Sandbox Code Playgroud)