JAVA 利用反射執行帶有泛型參數的方法

       雖然本文旨在說明如何利用反射執行帶有泛型參數的方法,但是還是先來看下這個議題的背景吧,我們的服務要接入公司裏面另一個平臺的一個服務,我們的服務是Java語言開發,他們的服務是PHP開發,雖然遠程過程調用無關乎語言,但是在傳參方面遇到了一些小問題;除此之外,還記得遠程過程調用需要客戶端的存根和服務器端的骨架嘛,當然這都是後話了。

      1.先來看下他們的接口地址:http://ip:port/services/AccountService.php

      2.其次是接口裏面我需要的那個API方法:getAccountById

      3.最後是API需要的參數:$arrIds   // 查詢的用戶id數組

      以上是他們官方文檔此接口的基本信息,因爲不需要關心結果就沒貼返回類型了,接下來開始按照他們官方文檔給的demo在我的服務中調試這個接口,他們的demo中給的例子接口是那種只需要傳單個值的,我換成數組類型的死活不行,無奈之下問了他們的客服人員,他們的客服發給我一個截圖,截圖顯示參數用了兩個中括號包住,例如params:[[1002]]

      首先PHP中的數組對應Java中的list,我們還是先來看下調用方式吧:

XXXProxy proxy = new XXXProxy("http://ip:port/services/AccountService.php", "UTF-8", new ExceptionPolicy());
Class<AcctountService> clazz = AcctountService.class;
List<Long> list=new ArrayList<>();
list.add(1002L);
Object result = proxy.invoke(null, clazz.getMethod("getAccountById", list.getClass()),new Object[]{list});
     上面那個代理客戶端是公司內部封裝的,所以就不便公開了,但他本質上是實現了InvocationHandler,通過動態代理來生成代理類,實現遠程過程調用。你說的沒錯,我本地需要寫一個一模一樣名字的API接口;如下:

public interface AcctountService {
 String[] getAccountById(ArrayList<Long> arrIds);
}

     然後通過代理客戶端生成的代理類通過反射調用目標方法,由於泛型編譯後有類型擦除的原因,雖然invoke方法的args參數只能是object數組類型,但是數組裏面可以傳任何類型的參數,我原本以爲invoke裏面的args參數傳一個new Object[]{1002L},他也會當成只有一個元素的數組,結果理解錯了,new Object[]{list}裏面是需要一個list的參數的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章