求泛型的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泛型


發佈了72 篇原創文章 · 獲贊 12 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章