如何在父類中獲取子類泛型的Class

假如你定義了一個有泛型的Base類,如下BaseClass<DO, VO>代碼示例,如何在BaseClass中獲取到子類對應的DO、VO的class對象呢?

class BaseClass<DO, VO> {
    Class<DO> doClass;
    Class<VO> voClass;
    ...
}

1. 傳統方式:通過參數傳遞或由子類指定

//通過參數傳遞
class BaseClass<DO, VO> {
    //Class<?>定義爲參數,通過參數傳遞
    public myMethod(..., Class<?> clazz){
        ...
    }
}
//由子類指定
class UserClass extends BaseClass<UserDO, UserVO> {
   ...{
       super.doClass = UserDO.class;
       super.voClass = UserVO.class;
   }
}

這種方式非常簡單容易理解,但會在方法/子類中產生冗餘代碼。

下面還有兩種更優雅的實現代碼:

2. 在Base類中通過Java反射統一獲取

class BaseClass<DO, VO> {
   ...{
        Type[] types = ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments();
        this.doClass = (Class<DO>)types[0];
        this.voClasss = (Class<VO>)types[1];
   }
}  
// 如果是接口獲取實現類的泛型class,需將getGenericSuperclass()替換成getGenericInterfaces()

3. 在Base類中通過Spring統一獲取

class BaseClass<DO, VO> {
    ...{
        ResolvableType resolvableType = ResolvableType.forClass(this.getClass()).getSuperType();
        ResolvableType[] types = resolvableType.getSuperType().getGenerics();
        this.doClass = (Class<DO>) types[0].resolve();
        this.voClasss = (Class<VO>) types[1].resolve();
    }
}

Diboot - 簡單高效的輕代碼開發框架 (歡迎star)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章