微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 在数组中的参数时调用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方法我不知道数组的大小直到运行时.

解决方法

The following does not work:

是的,它确实.

That does not work because args is threated by the compiler as a
single argument and the array is not “expanded” to vararg but is
wrapped (internally) in one more array with single element,i.e.

使用您提供的代码,数组的元素应该成为varargs参数.如果您没有这样做,要么您没有显示您的实际代码,要么出现其他错误.

如果你的args变量以某种方式没有数组类型(例如它是类型化的Object),那么就可能发生这种情况.但这不是你要展示的代码.

或者,如果你有一些“附加”参数你没有显示(例如你正在尝试做类似bar.invoke(someFoo,firstArg,args);那么它就不会扩展args,因为你正在使用varargs中的方法形式已经.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐