在Java中,我们常常需要获取泛型参数的类型,比如将使用了泛型的Java代码进行序列化和反序列化的时候。
一、在开始试图去获取泛型参数的类型前,可以试着去执行如下的类,看看执行的结果:
/** * */ package com.wsheng.aggregator.generic; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; /** * * @author Josh Wang(Sheng) * * @email swang6@ebay.com * */ public class GenericTest<T> { public static void main(String[] args) { GenericTest<String> test = new GenericTest<String>(){}; // 匿名内部类的声明在编译时进行,实例化在运行时进行 Type typeClass1 = test.getClass().getGenericSuperclass(); System.out.println(typeClass1); if (typeClass1 instanceof ParameterizedType) { Type actualType1 = ((ParameterizedType)typeClass1).getActualTypeArguments()[0]; System.out.println(actualType1); } else { System.out.println(typeClass1 + " is Not ParameterizedType"); } System.out.println(" ==================================== "); GenericTest<String> test2 = new GenericTest<String>(); // 所有的泛型类型在运行时都是Object类型 Type typeClass2 = test2.getClass().getGenericSuperclass(); System.out.println(typeClass2); if (typeClass2 instanceof ParameterizedType) { Type actualType2 = ((ParameterizedType)typeClass2).getActualTypeArguments()[0]; System.out.println(actualType2); } else { System.out.println(typeClass2 + " is Not ParameterizedType"); } } }
执行的结果是:
com.wsheng.aggregator.generic.GenericTest<java.lang.String> class java.lang.String ==================================== class java.lang.Object class java.lang.Object is Not ParameterizedType
从执行的结果可以清晰的看到, 使用匿名内部类的方式可以成功的获取到泛型参数的类型,而直接定义的类对象并不能获取到泛型参数的类型,看完下面的介绍便知道根本原因。
二、Java的泛型机制
Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)
三、Class类的getGenericSuperClass()方法解读:
Class的该方法,对于带有泛型的class,返回一个ParameterizedType对象,对于Object、接口和原始类型返回null,对于数组class则是返回Object.class。ParameterizedType是表示带有泛型参数的类型的Java类型,JDK1.5引入了泛型之后,Java中所有的Class都实现了Type接口,ParameterizedType则是继承了Type接口,所有包含泛型的Class类都会实现这个接口。
注意,实际运用中还要考虑比较多的情况,比如获得泛型参数的个数避免数组越界等。
四、匿名子类又是如何获取到具体的泛型类型?
这要依赖Java的Class字节码中存储的泛型参数信息。如前面所说,Java的泛型机制虽然在运行期间泛型类和非泛型类都相同(都是Object),但是编译java源代码生成的Class文件中还是保存了泛型相关的信息,这些信息被保存在class字节码常量池中,使用了泛型的代码处会生成一个signature签名字段,该签名signature字段指明了这个常量池的地址,于是可从该常量池中获取到具体的类型。
相关推荐
实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门
全面总结Java泛型--实例
265ps系列-photoshop特效合成技巧-实例讲解
主要介绍了Java 获取泛型的类型实现代码的相关资料,需要的朋友可以参考下
主要介绍了java 用泛型参数类型构造数组详解及实例的相关资料,需要的朋友可以参考下
Java泛型,泛型接口、泛型方法实例
java泛型实例讲解代码
3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3....
* 一个参数通配符的实例 * 说明:对一个包含了数值元素的集合进行汇总运算。在这种情况下,用户并不关心 * 集合中的每一个对象... * 方法声明了一个参数变量values是List类型,该集合中的元素必须是Number的子类对象
这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...
下面小编就为大家带来一篇JAVA利用泛型返回类型不同的对象方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
C++-多线程编程总结-实例讲解.doc
定义泛型类:展示如何定义一个简单的泛型类,以及如何创建该类的实例并使用泛型参数。 泛型方法:演示如何在普通类中定义泛型方法,以及如何调用和使用泛型方法。 类型通配符:展示如何使用类型通配符来增加灵活性,...
SVN快速上手-实例讲解,实例讲解适合懒人,三天能精通。
Java中的泛型,在运行时刻其具体类型是被擦除的,这样我们就不能用new T(),instanceof等关操作,特别是对泛型类型的类的实例化问题,在此根据《Thinking in Java》中所讲的对类型擦除所带来问题的三种解决方案,比较...
网上很多讲泛型原理的文章, 很少有提到我们什么时候使用泛型有优势, 我就泛型类和方法搞了两个实例,算是探索下泛型使用的冰山一角吧,在我博客里面有配套的文章,可以配套看.
基于java的开发源码-Message-Driven Bean EJB实例源代码.zip 基于java的开发源码-Message-Driven Bean EJB实例源代码.zip 基于java的开发源码-Message-Driven Bean EJB实例源代码.zip 基于java的开发源码-Message-...
主要介绍了Java泛型的用法及T.class的获取过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
泛型类、泛型方法、泛型接口、泛型委托 泛型类、泛型方法、泛型接口、泛型委托