数组中的参数时调用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,而是被(内部)包装为另一个具有单个元素的数组,即
@Testpublic 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