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

我有以下界面:

interface Foo {

void bar(String a, int b);

}

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

以下内容不起作用:

void gee(Foo someFoo, Method bar, Object[] args) {

bar.invoke(someFoo, args);

}

那是行不通的,因为args它受到编译器作为单个参数的威胁,并且该数组未“扩展”为vararg,而是被(内部)包装为另一个具有单个元素的数组,即

@Test

public void varArgTest() {

assertTrue(varArgFoo(new Object[] {1, 2}) == 1);

}

private static <T> int varArgFoo(T... arg) {

return arg.length;

}

Method.invoke()在这种情况下,我该如何调用,以使阵列受到vararg的威胁?

或更笼统的问题:当参数在数组中时,如何调用vararg方法?直到运行时我才知道数组的大小。

回答:

以下内容不起作用:

是的,它确实。

那是行不通的,因为args作为单个参数受到编译器的威胁,并且该数组未“扩展”为vararg,而是(内部)包装在另一个具有单个元素的数组中,即

使用您提供的代码,数组的元素应成为varargs参数。如果这对您而言没有发生,则是您没有显示实际代码,或者其他错误。

如果您的args变量某种程度上没有数组类型(例如,键入Object),则可能会发生这种情况。但这不是您要显示的代码。

或者,如果您没有显示一些“附加”参数(例如,您正在尝试执行bar.invoke(someFoo, firstArg,

args);,则该参数将不会扩展args,因为您已经在使用varargs形式的方法。

以上是 数组中的参数时调用Method.invoke() 的全部内容, 来源链接: utcz.com/qa/399530.html

回到顶部