美文网首页diboot
如何在父类中获取子类泛型的Class

如何在父类中获取子类泛型的Class

作者: 一个鸡蛋壳儿 | 来源:发表于2019-11-21 14:31 被阅读0次

    假如你定义了一个有泛型的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)

    相关文章

      网友评论

        本文标题:如何在父类中获取子类泛型的Class

        本文链接:https://www.haomeiwen.com/subject/sdhtwctx.html