Java反射:getMethod(String method,Object []。class)不起作用
您需要像這樣調(diào)用方法:
@H_301_2@s.invoke(this, new Object[]{new Object[]{'hi', 'there'}});(…或在@Jon的答案中使用替代方法。)
當(dāng)前代碼失敗的原因與Java中實(shí)現(xiàn)可變參數(shù)方法的方式有關(guān)。本質(zhì)上T1 xxx(T2... args)是的語法糖T1 xxx(T2[]args)。當(dāng)您調(diào)用方法時(shí), xxx(arg1, arg2, arg3)是的語法糖xxx(new T2[]{arg1, arg2, arg3})。
在這種情況下,您嘗試使用另一個(gè)具有相同數(shù)組基類型的變量方法來調(diào)用變量方法,并且該代碼有多種可能的解釋。
當(dāng)對可變調(diào)用有兩種可能的解釋時(shí),Java會 假定 您嘗試使用該調(diào)用的“未使用”版本而不是“使用”版本。或者更確切地說, 當(dāng)且僅當(dāng) :
實(shí)際參數(shù)的數(shù)量不等于形式參數(shù)的數(shù)量, 或者最后一個(gè)實(shí)際參數(shù)與最后一個(gè)形式參數(shù)的(數(shù)組)類型不兼容。如果您有興趣,可以在JLS的15.12.4.2節(jié)中指定此行為。
所以…我的解決方案通過強(qiáng)制執(zhí)行非可變解釋并顯式構(gòu)造所需的數(shù)組來工作。@Jon 的解決方案通過強(qiáng)制 正確的 方言解釋來起作用。
解決方法我有以下代碼:
public void myMethod(Object... args) { System.out.println('this is myMethod');}public void invokeMyMethod() { Method s = this.getClass().getMethod('myMethod',Object[].class); Object[] ex = new Object[2]; ex[0] = 'hi'; ex[1] = 'there'; s.invoke(this,ex);}
我收到異常java.lang.IllegalArgumentException:參數(shù)數(shù)量錯(cuò)誤。怎么了?
