zoukankan      html  css  js  c++  java
  • Java获得泛型的Class类型

    https://blog.csdn.net/taotaojs/article/details/81906511

    搭框架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”。  原文地址:

    江南白衣的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只是用来开发的时候做测试的,因为开发了好几个项目,发现基本的操作都是需要加工处理的, 这样就没必要了,对架构啥的还处于一知半解。

    最后欢迎大神/小伙伴留言讨论~

  • 相关阅读:
    bzoj 1853: [Scoi2010]幸运数字 容斥
    bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树
    bzoj 2331: [SCOI2011]地板 插头DP
    bzoj 3669: [Noi2014]魔法森林 动态树
    bzoj 2734: [HNOI2012]集合选数 状压DP
    bzoj 3751: [NOIP2014]解方程 同余系枚举
    bzoj 2594: [Wc2006]水管局长数据加强版 动态树
    bzoj 2049: [Sdoi2008]Cave 洞穴勘测 动态树
    bzoj 2209: [Jsoi2011]括号序列 splay
    bzoj 1223: [HNOI2002]Kathy函数 数位DP 高精度
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/14024863.html
Copyright © 2011-2022 走看看