`

如何获取父类的泛型的具体类型

阅读更多

问题的关键:clazz其实应该是T.class,clazz该如何获取???

public abstract class BaseDaoImpl<T> implements BaseDao<T>{

  private SessionFactory sessionFactory ;

  //比如Class<User>   clazz ,那么clazz就应该代表User.class 
  private Class<T> clazz ;         //clazz表示该类的子类传递给父类泛型上的类型即T.class  ,我需要在父类上获取父类泛型的具体类型,通过反射

protected BaseDaoImpl(){
   //由于BaseDaoImpls是抽象类,不能实例化,所以this表示子类的实例,那么我就可以利用this来获取父类(BaseDaoImpl)上的泛型的具体类型

  //getGenericSuperclass()方法:获取父类的泛型,返回值是Type类型,Type是Class类的接口,ParameterizedType类用于描述泛型的类,它是jdk升级后新添加的类,专门用来描述泛型

  ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();

  //getActualTypeArguments()方法:获取泛型的真实类型,返回值是Type[]
  clazz = (Class<T>) pt.getActualTypeArguments()[0] ;        

}

public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

public Session getSession(){
  return sessionFactory.getCurrentSession() ;
}

public void save(T entity){

this.getSession().save(entity) ;

} ;

public void update(T entity){
this.getSession().update(entity) ;
} ;

public void delete(Long id){
Object obj = this.getSession().get(clazz, id) ;
this.getSession().delete(obj) ;
} ;

public T getById(Long id){
  return (T) this.getSession().get(clazz, id) ;           //因为Seesion的get方法需要clazz是个Class类型,而且还必须是T.class,所以我要在上面极力获取到T.class
} ;

}

分享到:
评论

相关推荐

    654.652.JAVA基础教程_反射-获取运行时类的父类及父类的泛型(654).rar

    接下来,让我们探讨如何获取父类的泛型信息。在Java中,泛型是一种在编译时类型安全的机制,用于处理多种数据类型。然而,由于类型擦除,运行时无法直接获取泛型类型参数。但是,我们可以通过检查方法或字段的签名来...

    Java 获取泛型的类型实例详解

    使用继承方式获取泛型的类型实例是指在子类中获取父类的泛型类型实例,例如,我们可以定义一个抽象类 `JdbcDaoSupport&lt;T&gt;`,然后在子类 `UserDao` 中继承这个抽象类,并获取泛型类型实例。 ```java public abstract...

    类泛型工具类 - 【只作用于父类(非接口)有泛型的类】

    然而,泛型参数在编译后会经过类型擦除,这使得在运行时我们无法直接获取到泛型的具体类型信息。 类泛型工具类通过Java反射机制中的ParameterizedType类来获取父类的泛型参数类型。它提供了getGenericType静态方法...

    Java泛型的用法及T.class的获取过程解析

    首先,我们使用`getClass()`方法获取当前类的Class对象,然后使用`getGenericSuperclass()`方法获取当前类的父类的Type对象。最后,我们使用`getActualTypeArguments()`方法获取Type对象中的实际类型参数,然后将其...

    java反射

    该类提供了一系列用于处理泛型的方法,包括获取父类泛型类型、获取方法返回类型的泛型等。 ```java public class GenericsUtils { // ... } ``` ##### 2. 获取父类泛型类型 ```java public static Class&lt;?&gt; ...

    java.泛型与反射(解决方案).md

    但是,我们可以使用反射API中的`getGenericSuperclass()`或`getGenericInterfaces()`方法获取父类或接口的`Type`对象,并进一步使用`ParameterizedType`接口的方法来获取泛型参数信息。这种方式特别在处理不知道具体...

    泛型编程小实例(以List为例)

    - **实例化泛型**:创建带有具体类型的对象,如`List&lt;String&gt; stringList = new ArrayList();`。 4. **泛型的边界** 在Java中,可以指定泛型类型的边界,例如`List&lt;? extends Number&gt; numberList`表示numberList...

    java 泛型入门 实例

    使用时,我们可以指定`T`的具体类型,如`ArrayList&lt;String&gt;`或`ArrayList&lt;Integer&gt;`。 - **泛型方法**:在方法签名中使用类型参数,例如`public &lt;T&gt; T max(List&lt;T&gt; list)`,这个方法可以找出列表中的最大值,而不论...

    java.泛型类与方法(解决方案).md

    泛型方法是在方法层面上的泛型应用,它允许在方法上使用类型参数,使得方法能够独立于类的具体类型来操作数据。 1. **定义泛型方法**:在方法的返回类型前定义类型参数,然后在方法内部使用这个类型参数。泛型方法...

    Java泛型编程指南.pdf

    - **影响**:无法在运行时获取泛型的实际类型,只能获取到擦除后的类型。 #### 四、泛型在集合中的应用 **4.1 泛型集合** Java集合框架中的许多接口和类都支持泛型,如`List`, `Set`, `Map`等。 ```java List...

    博客《反射(2):泛型相关周边信息获取》对应源码

    例如,我们可以使用 `Class&lt;T&gt;.getGenericSuperclass()` 或 `Class&lt;T&gt;.getGenericInterfaces()` 来获取类的父类或接口的泛型信息。这些方法返回的是 `Type` 接口的实现,如 `ParameterizedType`,`WildcardType` 等...

    Java-泛型.ppt

    - 当子类也是泛型类时,子类和父类的泛型类型必须保持一致: ```java class ChildGeneric&lt;T&gt; extends Generic&lt;T&gt; {} ``` - 当子类不是泛型类时,父类必须明确泛型的数据类型: ```java class ChildGeneric ...

    Java泛型总结(2)进阶篇

    Java泛型在编译后会进行类型擦除,这意味着运行时无法获取到泛型的具体类型信息。所有的泛型类型在运行时都会被替换为其边界或Object。这解释了为什么我们不能在运行时通过反射检查一个对象是否属于某个泛型类型。 ...

    第1章 泛型+ppt+pdf+例子

    泛型也可以用于类的继承,子类可以继承父类的泛型类型,或者重新定义自己的类型参数。 最后,我们讨论一下泛型与多态的关系。泛型提供了一种新的多态形式,即类型参数多态。它允许我们在一个方法或类中处理多种类型...

    重新理解Java泛型

    - **泛型类**:泛型类是在类定义时引入类型参数的,如`Box&lt;T&gt;`中的`T`,它代表一个未指定的具体类型。这种设计使得类能够处理不同类型的对象,而不必为每种类型创建单独的类。例如,`Box&lt;Integer&gt;`、`Box&lt;Double&gt;`...

    第十三章 泛型程序设计

    }`,`T`代表任意类型,实例化时可以指定具体类型,如`Box&lt;String&gt; box = new Box();` 3. **泛型方法(Generic Method)** - 泛型方法可以在类的任何地方定义,与类的泛型参数无关,如`public &lt;T&gt; void printList...

    实例讲解Java泛型编程的快速入门

    在没有泛型的情况下,我们需要在获取集合元素时进行强制类型转换,这可能导致`ClassCastException`。泛型自动确保类型安全,避免了这种风险。 - 例如,`List&lt;String&gt; list = new ArrayList();`当我们从`list`中取出...

    Java中泛型的各种使用

    因此,泛型主要用于编译时的类型检查,无法在运行时获取泛型信息。 7. 容器类与泛型 Java集合框架中的许多类都使用了泛型,如`ArrayList&lt;T&gt;`、`HashMap, V&gt;`等。泛型使得我们可以指定容器存储的数据类型,从而避免...

    反射处理java泛型_.docx

    在处理泛型时,由于Java的类型擦除,直接使用常规方式无法获取到泛型参数的具体类型。这时,就需要借助反射来获取泛型信息。 `ReflectionUtil`是一个工具类,它扩展了Java标准库中的`java.lang.reflect`,提供了...

    Java1.5泛型指南中文版

    当我们实例化泛型类时,需要提供具体的类型,如 `List&lt;Integer&gt;`,这样就确保了列表中的元素只能是整数类型。 泛型与子类继承息息相关,泛型类的子类也可以指定自己的类型参数,但必须遵循父类的约束。例如,如果 `...

Global site tag (gtag.js) - Google Analytics