簡體   English   中英

數組中的參數時調用Method.invoke()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM