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://blog.csdn.net/ieayoio/article/details/46395667

Java使用反射来获取成员变量泛型信息的更多相关文章

  1. Java反射理解(四)-- 获取成员变量构造函数信息

    Java反射理解(四)-- 获取成员变量构造函数信息 步骤 获取成员变量信息: obj.getClass() 获取类类型对象 成员变量也是对象,java.lang.reflect.Field 类中封装 ...

  2. Java bean 链式获取成员变量无需判空的工具设计

    Java bean 链式获取成员变量无需判空的工具设计 本篇文章已发布至公众号 Hollis 对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者 ...

  3. Android(java)学习笔记109:通过反射获取成员变量和成员方法并且使用

    一.反射获取成员变量并且使用: 1.获取字节码文件对象:         Class c = Class.forName("cn.itcast_01.Person"); 2.使用无 ...

  4. Android(java)学习笔记50:通过反射获取成员变量和成员方法并且使用

    1. 反射获取成员变量并且使用: (1)获取字节码文件对象:         Class c = Class.forName("cn.itcast_01.Person"); (2) ...

  5. java 27 - 4 反射之 通过反射获取成员变量并使用

    类Field: 提供有关类或接口的单个字段的信息,以及对它的动态访问权限. A:获得类的成员变量 数组: 1.getFields(公共类的) 2.getDeclaredFields(所有类型的) B: ...

  6. java反射--获取成员变量信息

    获取成员变量信息 代码及说明: public static void printFieldMessage(Object obj) { //要获取类的信息,首先要获取类的类类型 Class c=obj. ...

  7. java 反射 - 获取成员变量的值.

    通过反射,可以获取所有声明的成员变量(包括所有的),代码如下: package spt.test.src; public class Person { private String name = &q ...

  8. kettle job如何利用java的反射机制获取执行的sql语句

    kettle job中的JavaScript如何获取同一个job中SQL步骤的执行语句并让执行语句记录在日志中呢?首先写日志需要用到job中JavaScript写日志的方法,其次是利用java反射机制 ...

  9. java学习(二)多态中成员变量详解

    今天我总结了一下java多态中成员变量的赋值与调用 举一个我当初做过的小案例: class Fu{ int num; void show(){} } class Zi extends Fu{ //in ...

随机推荐

  1. Ant demo

    <?xml version="1.0" encoding="UTF-8"?> <!-- 定义一个工程,默认任务为warFile. --> ...

  2. [转] vagrant学习笔记 - provision

    [From]  https://blog.csdn.net/54powerman/article/details/50684844 从字面上来看,provision是准备,实现的功能是在原生镜像的基础 ...

  3. Kubeadm and Kops

    Kubeadm是Kubernetes官方推出的快速部署Kubernetes的集群工具,其思路是将Kubernetes相关服务容器化以简化部署. With the release of kubeadm ...

  4. SpagoBI系列----------[01]SpagoBI简介及安装步骤

    商务智能套件SpagoBI提供一个基于J2EE的框架用于管理BI对象如报表.OLAP分析.仪表盘.记分卡以及数据挖掘模型等的开源BI产品.它提供的BI管理器能 够控制.校验.验证与分发这些BI对象. ...

  5. Android开发环境搭建步骤-【Android】

    本教程是android开发环境在windows下的安装配置,经本人测试完全正确无误.这个教程是史上最详细的android开发环境搭建教程. 工具/原料 Eclipse 3.7.0.Java Jdk6. ...

  6. 8.14_end

    the first interview 事件委托(ul.li) jsonp原理实现 印象最深的项目 each的实现 ajax的实现 性能优化的方法 判断Function和Boolean 印象最深的项目 ...

  7. 8086处理器的无条件转移指令——《x86汇编语言:从实模式到保护模式》读书笔记13

    本博文是对原书8.3.10的内容的总结. 一.相对短转移 指令格式是: jmp short 标号 标号也可以替换成具体的数值(标号和数值是等价的),例如 jmp short 0x2000 说明: (1 ...

  8. MySQL优化--表之间JOIN的关键字ON和Where (01)

    1. Join关键字,就是把多个表连接起来 而on和where都是条件,但是针对的对象不一样 1.1. 关键字 On是指怎样把两个表连接起来,如: on a.name = b.name 是一行一行的比 ...

  9. Django 入门项目案例开发(下)——创建项目应用及模型类

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. 前面两章是在已经开发好的项目上用来描述环境和业务,这一章创建一个全新的项目来用作开发,你可以跟 ...

  10. Bash编程(4) 参数与变量

    1. 变量命名 变量命名只能使用数字.下划线.字母,且仅能以下划线或字母开头. 变量很少使用单个字母,单个字母一般用于循环或读取一次性文件的时候. 例: while IFS=: read login ...