文档章节

Java使用反射来获取Map的泛型信息

Mr&Cheng
 Mr&Cheng
发布于 2014/05/31 19:24
字数 486
阅读 771
收藏 1

Java通过指定类对应的Class对象,程序可以获得该类里包括的所有Field,不管该Field使用private修饰,还是使用public修饰。获得了Field对象后,就可以很容易的获得该Field的数据类型,例如,下面的代码便是获得该Field对象foeld的类型:

Class<?> type = field.getType();

但是通过这种方式只对普通类型的Field有效,如果该Field的类型是有泛型限制的类型,如Map<String,Integer>类型,则不能准确得到该Field的泛型参数。

为了获得指定Field的泛型类型,应该使用如下方法来获取指定Field的泛型类型:

Type type = field.getGenericType();

然后将Type对象强制类型转换成ParameterizedType对象,ParameterizedType代表被参数化的类型,也就是增加了泛型限制的类型,ParameterizedType类提供了两个方法:

getRawType();返回被泛型限制的类型;

getActualTypeArguments();返回泛型参数类型。

下面,我们来看一个完整的例子,方便大家掌握:

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;


public class GenericTest {
	
	private Map<String , Integer> map = new HashMap<String, Integer>();
	
	public static void main(String[] args) throws SecurityException, NoSuchFieldException {
		// 获取Class实例
		Class<GenericTest> class1 = GenericTest.class;
		// 根据属性名取得该属性对应的Field对象
		Field mapField = class1.getDeclaredField("map");
		// 示范第一个方法:直接通过getType()取出Field的类型,只对普通类型的Field有效
		Class<?> class2 = mapField.getType();
		// 输出查看
		System.out.println("属性名为map的属性类型为:"+class2);
		
		// 示范第二种方法:
		Type mapMainType = mapField.getGenericType();
		// 为了确保安全转换,使用instanceof
		if (mapMainType instanceof ParameterizedType) {
			// 执行强制类型转换
			ParameterizedType parameterizedType = (ParameterizedType)mapMainType;
			// 获取基本类型信息,即Map
			Type basicType = parameterizedType.getRawType();
			System.out.println("基本类型为:"+basicType);
			// 获取泛型类型的泛型参数
			Type[] types = parameterizedType.getActualTypeArguments();
			for (int i = 0; i < types.length; i++) {
				System.out.println("第"+(i+1)+"个泛型类型是:"+types[i]);
			}
		} else {
			System.out.println("获取泛型类型出错!");
		}
	}
	
}



本文转载自:http://www.linuxidc.com/Linux/2012-06/62371.htm

共有 人打赏支持
Mr&Cheng
粉丝 29
博文 101
码字总数 7440
作品 0
广州
高级程序员
私信 提问
Spring 中好用的泛型操作API

随着泛型用的越来越多,获取泛型实际类型信息的需求也会出现,如果用原生API,需要很多步操作才能获取到泛型,比如: ParameterizedType parameterizedType = (ParameterizedType) ABServic...

宇的季节
06/06
0
0
java注解与反射,泛型与反射

一、反射与注解 内置注解 java内置了3种注解,用来为编译器提供检查。 1、@SuppressWarnings 2、@Deprecated 3、@Override 自定义注解 元注解 元注解是用来修饰注解的注解,java提供了3种元注...

极微
08/06
0
0
Java基础之反射(非常重要)

反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一、反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道...

Java-老刘
05/15
0
0
java基础强化——深入理解反射

目录 1.从Spring容器的核心谈起 2. 反射技术初探 2.1 什么是反射技术 2.2 类结构信息和java对象的映射 3 Class对象的获取及需要注意的地方 4. 运行时反射获取类的结构信息 5. 运行时反射获取...

takumiCX
07/28
0
0
Hibernate反射DAO模式

在持久层框架中,如果我们要像简单的JDBC连接数据库那样写一个通用的Dao方法的话,那么把JDBC简单的业务逻辑搬到hibernate持久层框架中,当然是不可能的,这里主要的问题就在于hibernate持久...

zretc
2013/07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux脚本中父shell与子shell 执行的几种方式

本文主要介绍以下几个命令的区别: shell subshell source $ (commond) `commond` Linux执行Scripts有两种方式,主要区别在于是否建立subshell 1. source filename or . filename 不创建sub...

问题终结者
15分钟前
1
0
git简单操作

1、 git init 初始化仓库 git add 1.txt 添加文件 git commit -m ”commit” 提交更新,添加注释 git status 查看仓库状态 git log 查看日志 //修改文件后提交更新 git diff 查看有哪些修改 ...

xiaobai1315
20分钟前
1
0
基于vue的Element-ui定义自己的select组件

基于vue的Element-ui定义自己的select组件 <template> <div> <el-select v-model="svalue" placeholder="请选择" filterable> <el-option v-for="item in options"......

莫沫达
22分钟前
1
0
对象检测(object detection)算法图解

摘要: 本文简要介绍图像检测中常用的深度学习方法——RCNN家族系列算法,以图像讲解形式,便于理解。 在生活中,经常会遇到这样的一种情况,上班要出门的时候,突然找不到一件东西了,比如钥...

阿里云官方博客
23分钟前
1
0
计算机通信协议学习-Http

HTTP协议: 引用:http://www.cnblogs.com/ranyonsue/p/5984001.html HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网( WWW:World Wide Web)服务...

xiaoyaoyoufang
26分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部