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

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

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;
   }
}

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

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

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)框架

相關文章
相關標籤/搜索