`

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

阅读更多

问题的关键: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泛型的用法及T.class的获取过程解析

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

    java反射

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

    泛型编程小实例(以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)`,这个方法可以找出列表中的最大值,而不论...

    博客《反射(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`,提供了...

    Java泛型技术之发展.pdf

    - **类型擦除限制**:由于类型擦除,泛型无法在运行时获取具体类型信息,因此不能用于反射或序列化。 6. **最佳实践** - 尽量避免使用无界通配符`?`,因为它限制了方法的可用性。 - 在可能的情况下,使用协变(`...

    Java泛型指南

    ` 来表示未知类型,这样我们可以在不知道具体类型的情况下操作数据结构。例如: ```java List&lt;?&gt; list; ``` 这表示 `list` 可以接受任何类型的 `List`。但是,由于我们不知道具体的类型,所以不能向这个列表添加...

    Java1.5泛型指南中文版

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

    Java1.5泛型指南

    泛型的核心在于类型参数(Type Parameter),这是一种用于创建泛型类或接口的占位符类型,允许在运行时确定具体类型。例如,`List&lt;T&gt;`中的`T`就是一个类型参数,表示“任何类型”。当创建一个`List`实例时,可以将`T...

Global site tag (gtag.js) - Google Analytics