這是乙個困擾了我好久的問題,在我寫的android請求框架總結(二)中寫到過利用框架自動解析json資料,**如下
object o;
if (result.charat(0) == ' else
listener.success(o);
返回的物件也只能是object型別,具體用的時候還需要做一下強轉
});其實當時有想過用泛型來做,但就是不知如何獲取泛型的實際型別,雖然已經比較簡潔了,但是感覺還不太徹底,如果直接能得到物件就更好了,終於,皇天不負有心人,有大神解決了這個問題,前兩天比較火的hongyang大神的okhttputils的一篇文章關於json自動解析的這一塊對我的幫助比較大,當然,我也順便吐槽下,okhttputils的封裝並不能幫助大家更好的理解okhttp,okhttp的設計非常優秀,但是經過這麼一封裝,又和之前看到的快速開發框架無異,希望看的人也能多思考,可以借鑑其中優秀的地方,同時也要能看到不足的一面,不要盲目跟風。
看**:
public static abstract
class
resultcallback
/*** 得到泛型t的實際type
*/static type getsuperclasstypeparameter(class> subclass)
parameterizedtype parameterized = (parameterizedtype) superclass;
return $gson$types.canonicalize(parameterized.getactualtypearguments()[0]);}}
使用
callback.onsuccess(new gson().fromjson(result, callback.type));
這樣就可以直接返回結果,如下:
//也支援list直接返回
});
這種方式可以簡化不少的**,但是android studio不是很給力,通常提示是這樣的
完了還要移動滑鼠手動去修改**,比原來做一下強轉也沒有方便多少,但還是有辦法的,還記得android studio提供的活動模板(live template)的功能嗎?android studio 使用技巧(三),這裡來體驗下它的強大之處,效果演示:
還有一點不明我測試了下gs
ontypes.canonicalize(parameterized.getactualtypearguments()[0]); 和
parameterized.getactualtypearguments()[0]
列印的結果是一樣的,去掉外面的一層包裹也能正常執行
獲取泛型實際型別
public class tutil catch instantiationexception e catch illegalacces ception e catch classcastexception e return null public static class forname stri...
Java 完美獲取泛型型別(包含巢狀多層的泛型)
獲取泛型型別工具類 2.1.整合介面帶有泛型 請使用 genericparadigmutil.parseinte cegenericparadigm 提供的 api object 想獲取那個物件的介面中泛型型別 clazz 即 object.getclass who 因為乙個類可以整合多個介面,wh...
Java 泛型 獲取 ClassName
public class commondaoimplimplements commondao的情況下 倘若希望獲得t 泛型 的classname 可參照 springside class clazz this.getclass type gentype clazz.getgenericsupercl...