闲话休提先看代码
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。
经过测试 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]方法得到该反省。