最近編寫接口的時候使用了反射機制,讀取一個jar包的方法,但該方法使用了不定長參數 Object...,進而關聯到Object[] 因此產生了一些問題,在此進行下總結。
獲取方法泛型問題:
輸入參數是 int nargout, Object... rhs 返回參數是 object[] ,存在同名的重載方法,在執行獲取方法時多次失敗。
cls.getMethod("funtionName",int.class,"空着不知道填什麼");
解決方案:
採用遍歷所有方法,再通過返回值過濾出該方法。
for (Method method1:methods) {
if (method1.getName().contains("funtionName")&&(method1.getReturnType()==Object[].class)){
method=method1;
break;
}
}
在這裏通過debug發現一個有趣的點object...反射在方法內部爲object[],故直接使用object[]也能成功獲取方法。
cls.getMethod("funtionName",int.class,object[].class);
注:object...反射後獲取方法不能爲object.class,必須是object[].class。
輸入泛型問題
其實在採用遍歷之前也嘗試過object[],但在輸出報錯,最後檢查發現是輸入數據問題。向object[]輸入數據多次報錯。
Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch
解決方案:
應該將原本的泛型輸入改爲object[]的形式,經測試後通過:
Object outputObj= funtionClass.newInstance();//初始化一個實例
Object[] input=new Object[1];
input[0]=oldinput;
Object output = (Object[]) method.invoke(outputObj, 1, input);
其他說明:
完整demo見下面第一個鏈接,我這裏只是一些補充問題。
問題
1.泛型執行對運行效率的影響
2.泛型的資源回收。
參考文章:
基礎代碼的模板採用了這篇文章的demo https://www.cnblogs.com/cxchanpin/p/6789166.html
反射相關方法解析 https://blog.csdn.net/lycorisradiata_1/article/details/48493255