搭框架ing
今天在解決Bean對象與VO對象相互轉換以及Controller兼容兩種對象的問題
這次就來談談遇到的一個印象最深刻的問題——泛型獲取類型
上代碼
public class BeanController<T,V> { @Autowired IBeanService<T> beanService; @RequestMapping("/list") @ResponseBody public Object list() throws Exception{ List<T> list = beanService.findAll();//查詢所有結果 return EntityUtils.copyDataList(list, /*TODO 要得到V的類型*/);//將Bean對象轉為VO對象 } }
EntityUtils.copyDataList方法就是將兩個List集合的數據相互復制,比如說List<Staff>和List<StaffVO>
而第二個參數剛好需要V的類型
V是不能實例化或者.Class的
這里引用了 轉載超多的一篇文章
江南白衣的blog文章:使用反射來獲得“T.class”。 原文地址:
感興趣的同學可以去看看,試着理解一下。我個人感覺看轉載還是看原版的好,特別是那種完全復制過來的轉載,百度一搜一大片,還可能因為版本等 各種問題測試不通過,不開篩選真的沒法看。。
好了,嗶嗶結束
江南白衣的這篇文章大概就是 創建一個父類,讓需要獲取泛型類型的類更方便使用,如下
import lombok.Data; @Data public class GenericityOperationSuper<T> { /** 泛型的類型 */ private Class<T> entityClass; private int index = 1; public GenericityOperationSuper(){ BaseHibernateEntityDao(); } @SuppressWarnings("unchecked") public void BaseHibernateEntityDao() { //System.out.println("classList +++++++++" + ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()); entityClass =(Class<T>) ((ParameterizedType) getClass() .getGenericSuperclass()).getActualTypeArguments()[index]; } }
因為我是雙泛型,所以就加了一個index序號,index=1表示獲取第二個泛型【顧名思義,江南白衣獲取的就是第一個泛型】
而這很長的語句就是獲取本類所有的泛型(可以自己打印看看)
注意:如果子類繼承了該類,那么這里的本類已經指子類了
所以要獲取泛型的類型只要獲取entityClass屬性即可,如下
public class BeanController<T,V> extends GenericityOperationSuper<V> { @Autowired IBeanService<T> beanService; @RequestMapping("/list") @ResponseBody public Object list() throws Exception{ List<T> list = beanService.findAll();//查詢所有結果 return EntityUtils.copyDataList(list, getEntityClass());//將Bean對象轉為VO對象 } }
這里GenericityOperationSuper<V>中的V
親測對結果沒有任何影響,你把他刪了都行【就是會出現黃黃的波浪線】
我Bean對象和VO對象沒有內部關聯, 按理說應該返回會有影響的,后續討論
好了,就是這樣,快去捕捉自己的小泛型吧。
噢,這個通用Controller只是用來開發的時候做測試的,因為開發了好幾個項目,發現基本的操作都是需要加工處理的, 這樣就沒必要了,對架構啥的還處於一知半解。
最后歡迎大神/小伙伴留言討論~