如何获取泛型T的类型即T.class

如何获取泛型T的类型即T.class

  • 想写一个spring-boot中mongodb的工具类,对mongodb的一些放进进行简单的封装,在写工具类的过程中发现spring-boot集成的mongodb方法中许多都需要用到实体类的类型,而工具类中我是用泛型T代表实体类,所以遇到的最大的问题就是不能获取到T.class。不太明白什么意思的直接看例子。

  • 问题—例子

    • 不太美观的工具类

      /**
       * @author zhao_jianbo
       */
      @Component
      public class MongoDbOperImpl<T> implements BaseDbOper<T> {
      
          @Autowired
          private MongoTemplate mongoTemplate;
      
          /**
           * 根据id删除数据
           *
           * @param id
           * @param entity
           * @return 删除数据的条数
           */
          @Override
          public Long deleteById(String id, T entity) {
              Query query = new Query(Criteria.where("id").is(id));
              return mongoTemplate.remove(query,     entity.getClass()).getDeletedCount();
          }
      
      
    • 从上面的例子中可以看出mongoTemplate.remove()需要一个实体类的class即T.Class,在网上搜了很多关于如何获取T.class的文章,但是那些方法只适用于T是明确的类型例如MongoDbOperImple<User>所以无奈之下将实体类手动传入,虽然保留了代码的灵活性但是看上去非常不美观,我只是想根据id删除一条数据,在调用方法的时候必须的传入实体类,很不好!

  • 改进方法

    • 改进方法来源于HibernateDaoImpl

    • 具体为什么这样能行我也不太清楚,明白的大佬说一下

    • 改进后的例子如下

    • 工具类

      /**
       * @author zhao_jianbo
       */
      @Component
      public class MongoDbSupport<T> implements BaseDbOper<T> {
      
          @Autowired
          private MongoTemplate mongoTemplate;
      
          /**
           * 获取T.class
           *
           * @return
           */
          private Class<T> getEntry() {
              Type type = getClass().getGenericSuperclass();
              Class<T> result = null;
              if (type instanceof ParameterizedType) {
                  ParameterizedType pType = (ParameterizedType) type;
                  result = (Class<T>) pType.getActualTypeArguments()[0];
              }
              return result;
          }
      
          /**
           * 根据id删除数据
           *
           * @param id
           * @return 删除数据的条数
           */
          @Override
          public Long deleteById(String id) {
              Query query = new Query(Criteria.where("id").is(id));
              return mongoTemplate.remove(query, getEntry()).getDeletedCount();
          }
      
    • 实体类

      /**
       * @author zhao_jianbo
       */
      @Data
      @NoArgsConstructor
      @AllArgsConstructor
      @Document(collection = "book")
      @Repository
      public class Book extends MongoDbSupport<Book> {
      	......
      }
      

    现在明白为什么hibernate和mybitas需要实体类需要继承工具类

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值