java获取泛型参数的类型的方法 - 实例讲解
2016-03-01 20:01
676 查看
在Java中,我们常常 需要获取泛型参数的类型,比如将使用了泛型的Java代码进行序列化和反序列化的时候。
一、在开始试图去获取泛型参数的类型前,可以试着去执行如下的类,看看执行的结果:
从执行的结果可以清晰的看到, 使用匿名内部类的方式可以成功的获取到泛型参数的类型,而直接定义的类对象并不能获取到泛型参数的类型,看完下面的介绍便知道根本原因。
Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)
三、 Class类的getGenericSuperClass() 方法解读:
Class的该方法, 对于带有泛型的class,返回一个ParameterizedType对象,对于Object、接口和原始类型返回null,对于数组class则是返回Object.class。ParameterizedType是表示带有泛型参数的类型的Java类型,JDK1.5引入了泛型之后,Java中所有的Class都实现了Type接口,ParameterizedType则是继承了Type接口,所有包含泛型的Class类都会实现这个接口。
注意,实际运用中还要考虑比较多的情况,比如获得泛型参数的个数避免数组越界等。
一、在开始试图去获取泛型参数的类型前,可以试着去执行如下的类,看看执行的结果:
/** * */ 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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树