如何使用反射技术获取泛型类的真实类型?

平常我们需要获取某个类的类型,一般是直接使用 "实例.getClass()",获取 "类名 .class" 直接获取 。

例如: 假设此时有一个User类,那么要获取该User类的真实类型的话,可以直接使用类名+".class"获取: ”User.class“

或者,通过User类的实例 user.getClass() 来获取;

上面两个例子是已经确定是User类型了,所以,才可以使用上面的方法。

而泛型类因为还不能确定是什么类型,所以没办法使用上面的两个方法(实例.getClass(),类名.class);

如果类是泛型的话,那么该如何获取呢?

我们可以通过获取该泛型类的子类的传入的类型参数来确定该泛型类的真实类型。

如:

有个类继承了一个泛型类,给该泛型类传入了一参数 "User" --->这个参数就是解决问题的关键点了

  1. public UserDao extends BaseDaoImpl<User>{
  2. .....
  3. }

该泛型类BaseDaoImpl<T>的代码如下:

  1. public BaseDaoImpl<T> implements BaseDao<T>{
  2. public BaseDaoImpl() {
  3. ParameterizedType pt = (ParameterizedType) this.getClass()
  4. .getGenericSuperclass();
  5. this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
  6. //输出结果,验证类型名称是否正确
  7. //System.out.println("clazz --> " + clazz.getSimpleName()); //getSimpleName()是返回不包含包名的类名称
  8. }
  9. }

BaseDaoImpl<T>的构造函数中的 this 指的是子类的实例。

this.getClass()获取子类的真实类型;

getGenericSuperclass(); 获取泛型父类

pt.getActualTypeArguments(); 通过该泛型父类来获取真实的类型参数的数组;也就是获取泛型父类的尖括号里面的参数<T>,

因为泛型的尖括号是可以有多个参数的,所以该方法返回的是一个数组。

pt.getActualTypeArguments()[0]; 获取该数组的第一个值。因为我们知道在该例子中BaseDaoImpl<T>只有一个参数T。所以我们只需要获取第一个值就可以了。

结束。

来自为知笔记(Wiz)

时间: 2024-08-28 18:53:39

如何使用反射技术获取泛型类的真实类型?的相关文章

反射技术获取到对象中的指定方法

使用反射技术根据路径获取到对象对象.Class获取到class对象使用class对象通过getDeclaredFields()方法获取到目标类中的属性值集合Field[]使用class对象通过getDeclaredMethods方法获取到目标类中的方法集合public void Test(){User user = new User();Class clazz = user.getClass();Fiedld[] fields = clazz.getDeclaredFields();for(Fi

通过java反射机制获取该类的所有属性类型、值。

转自:http://blog.sina.com.cn/s/blog_3c62c21f01011xci.html 方法使用了这俩个包下的 field 和method import java.lang.reflect.Field; import java.lang.reflect.Method; public static void getObjectValue(Object object) throws Exception {   //我们项目的所有实体类都继承BaseDomain (所有实体基类

泛型类中,获取当前new的对象的 T的真实 类型

public abstract class BaseDaoImpl<T> implements BaseDao<T> { @Resource private SessionFactory sessionFactory; private Class<T> clazz; public BaseDaoImpl() { // 使用反射技术得到T的真实类型 ParameterizedType pt = (ParameterizedType) this.getClass().get

Java反射技术学习总结

-------<a href="http://www.itheima.com/"">android培训</a>.<a href="http://www.itheima.com/" ">java培训</a>期待与您交流!---------- Java反射技术就是将java中的类的各个组成部分反射出来变为java中相应的数据类型获得. Java同样将类中的各个组成部分进行封装,变为一个个Java类. C

Java中类加载机制和反射技术

我们知道一个对象在运行时有两种类型,一个是编译类型,一个是运行时类型.在程序运行时,往往是需要发现类和对象的真实的信息的.那么如何获的这种信息呢? 其一,如果我们在编译和运行时都知道类型的具体信息,这时是可以手动将一个对象转换为运行时的类型. 其二,如果我们在编译时无法预知对象和类到底是属于哪些类,那么程序只有依靠运行时的信息来发现对象和类的真实的信息了,这时就必须要用到反射技术. 在谈具体的发射技术之前,我想先回顾下,有关类的加载的一些基本的性质和原理,以方便我们更好地理解,反射的作用和特点.

深入浅出 .NET C# 反射技术

反射这个词听起来就很牛逼是吧? 嗯的确,反射是比较高级的特性,只有语言基础很扎实的Dev们才应该使用它. 搞点反射,可以提高程序的灵活性.可扩展性.耦合度. 反射这东西,是为了动态地运行时加载,相比于静态代码.编译的时候就是板上钉钉了. 就是说,如果你的程序需要在运行时搞一些晚绑定,动态加载或检查对象之类的操作时,那么反射欢迎你. 说到这,也许有人立刻就去找反射相关的文档和教程,想赶紧把反射技术实践到程序上. 给爷爪巴 使用反射是要分场合的 反射基本上是一种解释操作,用于字段啊方法啊接入时要远慢

7. 反射技术:其实就是动态加载一个指定的类

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1.获得Class对象,就是获取到指定的名称的字节码文件对象. 2.实例化对象,获得类的属性.方法或构造函数. 3.访问属性.调用方法.调用构造函数创建对象. 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取.

C#反射技术概念作用和要点

反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等.有了反射,即可对每一个类型了如指掌.如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道. 1..NET可执行应用程序结构 程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构. 应用程序结构分为应用程序域—程序集—模块—类型—成员

反射技术

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1.获得Class对象,就是获取到指定的名称的字节码文件对象. 2.实例化对象,获得类的属性.方法或构造函数. 3.访问属性.调用方法.调用构造函数创建对象. 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取.