[英]Call Method.invoke() when arguments in array
我有以下界面:
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方法?直到運行時我才知道數組的大小。
vararg參數實際上是帶有一些額外元數據的數組參數。 因此,當使用Method.invoke
,需要將數組包裝在另一個數組中:
Object[] varargs = new Object[] { 10, 20 };
Object argumentArray = new Object[] { varargs };
method.invoke(target, argumentArray);
以下內容不起作用:
是的,它確實。
那是行不通的,因為args作為單個參數受到編譯器的威脅,並且該數組未“擴展”為vararg,而是(內部)包裝在另一個具有單個元素的數組中,即
使用您提供的代碼,數組的元素應成為varargs參數。 如果這對您沒有發生,則可能是您沒有顯示實際的代碼,或者其他錯誤。
如果您的args
變量不具有數組類型(例如,鍵入Object
),則可能會發生這種情況。 但這不是您要顯示的代碼。
或者,如果您沒有顯示一些“附加”參數(例如,您嘗試執行類似bar.invoke(someFoo, firstArg, args);
,那么它將不會擴展args
,因為您正在varargs中使用該方法已經形成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.