标签:java reflection variadic-functions
我有以下界面:
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中的方法形式已经.
标签:java,reflection,variadic-functions 来源: https://codeday.me/bug/20190714/1460953.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。