如何获取泛型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需要实体类需要继承工具类
-