调用Method.invoke()当在数组参数(Call Method.invoke() when

2019-07-17 15:59发布

我有以下接口:

interface Foo {
  void bar(String a, int b);
}

我想要调用Foo.bar (上富的实现)反思。 然而,自变量是数组 ,我不知道它的大小。

以下不工作:

void gee(Foo someFoo, Method bar, Object[] args) {
  bar.invoke(someFoo, args);
}

不工作,因为args是由编译器在一个以上的阵列与单个元件,即threated作为单个参数和所述阵列不是“展开”,以可变参数而被包裹(内部)

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

private static <T> int varArgFoo(T... arg) {
    return arg.length;
}

我怎么能叫Method.invoke()在这种情况下,这样的阵列threated为可变参数?
或者更一般的问题:我如何调用可变参数的方法时参数是数组我不知道该阵列,直到运行时的大小。

Answer 1:

以下不工作:

是的,它确实。

不工作,因为ARGS是由编译器在一个以上的阵列与单个元件,即threated作为单个参数和所述阵列不是“展开”,以可变参数而被包裹(内部)

随着你提供的代码,数组的元素应该成为可变参数的参数。 如果不是发生了你,要么你没有显示你的实际代码,或别的东西是错误的。

如果你不知何故args变量没有数组类型(例如,它是类型化的Object ),那么就可能发生。 但是,这是不是你出的代码。

或者,如果你有没有显示(请一些“额外”的参数如你试图做类似bar.invoke(someFoo, firstArg, args); ,那么就不会扩大args ,因为你正在使用的方法中的可变参数形成了。



Answer 2:

甲可变参数参数实际上是具有一些额外元数据的阵列参数。 所以,当你使用Method.invoke ,你需要用在另一个数组的数组:

Object[] varargs = new Object[] { 10, 20 };
Object argumentArray = new Object[] { varargs };
method.invoke(target, argumentArray);


文章来源: Call Method.invoke() when arguments in array