一般获取具体某个类的class类型,直接调用 getClass()
方法或者 .class
。但是在一些抽象类 或者 接口中,我们需要获得泛型对应的class类型,以上方法就不再适用。比如以下场景,想获得AbstractServiceImpl
中的三个泛型类型:
/**
*
* 通用service,这里有三个泛型 T,D,ID
* Created by zhangshukang on 2018/1/8.
*/
public abstract class AbstractServiceImpl<T extends BaseDTO,D extends BaseDO, ID extends Serializable> implements BaseService<T,D,ID> {
public BaseMapper<D, ID> baseMapper;
@Override
@Autowired
public void setBaseMapper(BaseMapper<D, ID> baseMapper) {
this.baseMapper = baseMapper;
}
@Override
public long insert(T t) {
//这里在抽象的业务逻辑中,需要获得泛型对应的 class 类型
Class<D> dc = (Class<D>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1];
D d= BeanUtils.simpleDOAndBOConvert(t,dc);
int result = baseMapper.insert(d);
return id;
}
}
关键代码:((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()
方法,获得的是当前类所有的泛型类型,而且是有顺序的,顺序为定义类时泛型的位置:
public abstract class AbstractServiceImpl<T extends BaseDTO,D extends BaseDO, ID extends Serializable> implements BaseService<T,D,ID>
对应的位置关系如上图。