为这个简单的问题表示歉意,但是我遇到了以下代码段(是对另一个问题的回答),但我真的不明白ParameterizedType和this.entity行的含义是什么?我猜想它正在将类键入为T,但是我自己无法解释代码。
public class GenericDaoJpaImpl<T, PK extends Serializable> implements GenericDao<T, PK> {
protected Class<T> entityClass;
@PersistenceContext
protected EntityManager entityManager;
public GenericDaoJpaImpl() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
this.entityClass = (Class<T>) genericSuperclass.getActualTypeArguments()[0];
}
返回表示该类表示的实体的直接超类的Type(类,接口,原始类型或void)。如果超类是参数化类型,则返回的Type对象必须准确反映源代码中使用的实际类型参数。如果以前没有创建过代表超级类的参数化类型,则会创建该参数化类型。有关参数化类型的创建过程的语义,请参见ParameterizedType的声明。如果该Class表示Object类,接口,原始类型或void,则返回null。如果此对象表示数组类,则返回表示Object类的Class对象。
该getGenericSuperclass
方法返回类型对象,在这种情况下为ParameterizedType。ParameterizedType是实际的Java类,是反射包的一部分。
ParameterizedType表示参数化类型,例如Collection。如该程序包中所指定的,在反射方法第一次使用参数化类型时会创建该参数化类型。创建参数化类型p时,将解析p实例化的通用类型声明,并以递归方式创建p的所有类型参数。有关类型变量的创建过程的详细信息,请参见TypeVariable。重复创建参数化类型无效。
实现此接口的类的实例必须实现equals()方法,该方法使共享相同泛型类型声明并具有相同类型参数的任何两个实例相等。
然后调用ParameterizedType.getActualTypeArguments:
返回一个Type对象数组,该数组代表此类型的实际类型参数。请注意,在某些情况下,返回的数组为空。如果此类型表示嵌套在参数化类型内的非参数化类型,则可能会发生这种情况。
因此,总结一下代码,该GenericDaoJpaImpl
方法将获取其自身的超类,然后从该类中提取实际的Type信息,在这种情况下,该信息仅是第一个元素。如果查看类定义,您将看到它以通用类型'T'声明。因此,该方法将提取用于该类实例的T的实际Type。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句