关于getGenericSuperclass方法和getActualTypeArguments()[0]方法的使用

闲话休提先看代码

public BaseCRUDService() {
    try {
        Type e = this.getClass().getGenericSuperclass();
        if(e instanceof ParameterizedType) {
            this.entityClass = (Class)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
            this.entityClassName = this.entityClass.getSimpleName();
        }
    } catch (RuntimeException var2) {
        var2.printStackTrace();
    }

}
这是我公司框架的api

这里先解释下Type这个类

Type 是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。

其中this.getClass()是获取当前类的Class,之后调用

getGenericSuperclass()

先看getGenericSuperclass()的API解释

getGenericSuperclass

public Type getGenericSuperclass()
返回表示此  Class 所表示的实体(类、接口、基本类型或 void)的直接超类的  Type
所以他的意思就是返回当前类的父类的Type

经过测试 int,Object调用getClass().getGenericeSuperclass()返回值是null,说明他们没有直接的父类。当返回值部位null时,

e instanceof ParameterizedType

的意思就是 如果该条件为真,则本类(代码中的this)支持泛型,如果没有则不支持。

先看

ParameterizedType的api

接口 ParameterizedType

所有超级接口:
Type

public interface ParameterizedType
     
    
    
     
     
      extends 
      
     
     Type
     
    
    

ParameterizedType 表示参数化类型,如 Collection<String>。

参数化类型在反射方法首次需要时创建(在此包中指定)。当创建参数化类型 p 时,p 实例化的一般类型声明会被解析,并且按递归方式创建 p 的所有类型参数。有关类型变量创建过程的详细信息,请参阅 TypeVariable。重复创建的参数化类型无效。

实现此接口的类的实例必须实现 equals() 方法,该方法用于比较两个共享相同一般类型声明和具有相同类型参数的任何实例。

ParameterizedType是个接口
如果该接口有泛型(
ParameterizedType<T>
),则可以通过

getActualTypeArguments()[0]方法得到该反省。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值