求泛型的Class

项目开发中为了减少重复代码,常常会使用到Java泛型。有时候就需要求泛型的类型。

GenericFoo.java是基类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * Created by li on 2015/10/31.
 */
public abstract class GenericFoo<T> {
    protected Logger logger = LoggerFactory.getLogger(this.getClass());

    private Class<T> beanClass;

    public Class<T> getBeanClass(){
        logger.debug("this: " + this.getClass() + "\t Super: " + getClass().getGenericSuperclass());
        Type type =getClass().getGenericSuperclass();
//        if (!ParameterizedType.class.isAssignableFrom(type.getClass())) {
//            return null;
//        }
        ParameterizedType paraType = (ParameterizedType)getClass().getGenericSuperclass();
        logger.debug(type.toString());
        beanClass = (Class<T>) paraType.getActualTypeArguments()[0];
        logger.debug("beanClass: " + beanClass);
        return this.beanClass;
    }
}
GenericFooChild.java是子类

public class GenericFooChild<T> extends GenericFoo {

}
编写Junit测试类

import com.cqs.models.user.model.User;
import org.junit.Test;


/**
 * Created by li on 2015/10/31.
 */
public class GenericFooChildTest {

    private GenericFooChild child = new GenericFooChild();

    @Test
    public void testGetBeanClass() throws Exception {
        child.getBeanClass();
    }
}


运行结果



查了一些帖子:子类(GenericFooChild)在集成父类(GenericFoo)时不能还写抽象类,需要传入具体的类别

所以:

需要将GenericFooChild修改为:


import com.cqs.models.user.model.User;

/**
 * Created by li on 2015/10/31.
 */
public class GenericFooChild extends GenericFoo<User> {

}

运行结果



还有一个一种办法可以求泛型的类型:

在构造器中,传入具体的泛型类型:

父类修改为【添加含参构造函数,getBeanClass()可以直接返回beanClass】:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by li on 2015/10/31.
 */
public abstract class GenericFoo<T> {
    protected Logger logger = LoggerFactory.getLogger(this.getClass());

    private Class<T> beanClass;


    public GenericFoo(Class<T> beanClass) {
        this.beanClass = beanClass;
    }

    public Class<T> getBeanClass(){
        logger.debug("beanClass: " + beanClass);
        return this.beanClass;
    }
}


 子类和JUnit测试类,也要相应的修改 

import com.cqs.models.user.model.User;

/**
 * Created by li on 2015/10/31.
 */
public class GenericFooChild extends GenericFoo<User> {

    public GenericFooChild(Class<User> beanClass) {
        super(beanClass);
    }
}

import com.cqs.models.user.model.User;
import org.junit.Test;

/**
 * Created by li on 2015/10/31.
 */
public class GenericFooChildTest {

    private GenericFooChild child = new GenericFooChild(User.class);

    @Test
    public void testGetBeanClass() throws Exception {
        child.getBeanClass();
    }
}

运行结果:


参考:(翻译)反射处理java泛型


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值