2012-12-24 15 views
2

我想用getDeclaredMethod()找到一個方法與此簽名:獲取getDeclaredMethods()來匹配可變參數方法

public void foo(String inArg1, Object... inArgs); 

使用此電話:

Class<?>[] argClasses = { String.class, Integer.class }; 
Method m = clazz.getDeclaredMethod("foo", argClasses); 

但它會產生一個NoSuchMethodException例外。但是,它可以調用的方法(假設你發現一些其他的方式):

Object[] args = { "arg1", new Integer(2) }; 
m.invoke(instance, args); 

我可以一一列舉,與getDeclaredMethods(),然後嘗試做匹配自己的簽名,但是,似乎是一個大量的工作。

我想做的事情有可能嗎?我只是想念一些愚蠢的東西?

+0

您可能需要傳遞Object []。類而不是Integer.class – hoaz

回答

1

的方法是調用與任何對象(一個或多個),因爲它是宣佈接受對象(S)。 - 但是,因爲它是宣稱Object類型,您不會找到通過getDeclaredMethod()如果您不搜索確切聲明類型。

你應該可以,不過,遍歷所有聲明的方法,並檢查他們parameter types,看看他們是assignable from您的特定類型以找到那些調用與參數的所有方法。

實施例:

Class[] signature = {String.class, Integer.class}; 
Method[] methods = someClass.getDeclaredMethods(); 

for (Method m : methods) { 
    Class[] params = m.getParameterTypes(); 
    if (params.length == signature.length) { 
    int i; 
    for (i = 0; i < signature.length && params[i].isAssignableFrom(signature[i]); i++) { 

    } 
    if (i == signature.length) { 
     System.out.println("Found matching method: " + m.getName()); 
    } 
    } 
} 

然而,我沒有檢查哪種類型(一個或多個)Object...實際上從分配。由於可變參數編譯爲數組,因此我認爲它不是Integer而是Integer[]

+0

不是我想聽到的答案,但是,這是我得出的結論。謝謝! – Rick

5

可變參數只是一個數組的語法糖。該方法的簽名是

foo(String, Object[]); 

,而不是

foo(String, Integer); 
+0

是的,我知道。但是,調用foo(「arg1」,2)是完全合法的,所以它看起來應該如我上面所建議的那樣匹配(儘管我聲明的調用可能是錯誤的)。 這是事情。我正試圖將DSL中的呼叫映射到「原生」Java方法。我將參數作爲數組獲取,我需要匹配任何可能適合帳單的方法。如果getDeclaredMethod()會匹配它,這將很容易。 – Rick

+0

一種方法只有一個簽名。這是合法的,因爲編譯器搜索的簽名與參數兼容。但是這並不會改變方法的簽名。 –

1

你應該把varargs作爲數組:

Class<?>[] argClasses = { String.class, Object[].class }; 
Method m = clazz.getDeclaredMethod("foo", argClasses); 
3

找到FOO方法的唯一合法途徑是

Class<?>[] argClasses = { String.class, Object[].class }; 
Method m = clazz.getDeclaredMethod("foo", argClasses); 

as對於

Object[] args = { "arg1", new Integer(2) }; 
m.invoke(instance, args); 

這是完全合法,就像調用foo無反射

foo("str", new Integer(2)); 
相關問題