Java | 获取类中所有的泛型对应的class类型

一般获取具体某个类的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>

这里写图片描述
对应的位置关系如上图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值