加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 05:10:18 所属栏目:Java 来源:网络整理
导读:我有以下界面: interface Foo { void bar(String a,int b);} 我想反思地调用Foo.bar(在Foo的实现上).但是,参数是在数组中,我不知道它的大小. 以下不起作用: void gee(Foo someFoo,Method bar,Object[] args) { bar.invoke(someFoo,args);} 这不起作用,因为
我有以下界面:

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中的方法形式已经.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读