Java使用反射来获取成员变量泛型信息

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

时间: 2024-10-25 08:03:33

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

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

Java反射理解(四)-- 获取成员变量构造函数信息 步骤 获取成员变量信息: obj.getClass() 获取类类型对象 成员变量也是对象,java.lang.reflect.Field 类中封装了关于成员变量的操作: getFields() 方法获取的是所有的public的成员变量的信息 getDeclaredFields() 获取的是该类自己声明的成员变量的信息 getType() 得到成员变量的类型的类类型 getName() 得到成员变量的名称 获取成员变量构造函数信息: obj.g

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

1 package cn.itcast_03; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 6 /* 7 * 通过发生获取成员变量并使用 8 */ 9 public class ReflectDemo { 10 public static void main(String[] args) throws Exception { 11 // 获取字节码文件对象 12 Class c = C

00112_通过反射获取成员变量并使用

1.在反射机制中,把类中的成员变量使用类Field表示: 2.通过Class类中提供的方法获取成员变量: (1)返回一个成员变量 public Field getField(String name) 获取指定的 public修饰的变量 public Field getDeclaredField(String name) 获取指定的任意变量 (2)返回多个成员变量 public Field[] getFields() 获取所有public 修饰的变量 public Field[] getDecla

Java--Reflect(反射)专题4——获取成员变量以及构造函数信息

转载请注明:http://blog.csdn.net/uniquewonderq 首先写一个获取成员变量的静态方法: 成员变量也是对象, 是java.lang.reflect.Field类的对象 Field类封装了关于成员变量的操作 getFields()获取的是所有的public的成员变量的信息 getDeclaredFields()获取的是该类自己声明的成员变量的信息,可能是私有的也可能是共有的 public static void printFieldMessage(Object obj)

反射获取成员变量,并修改值

/* * 反射获取成员变量,并修改值 * Person类中的成员String name */ public class ReflectDemo5 { public static void main(String[] args) throws Exception{ Class c = Class.forName("cn.itcast.demo1.Person"); Object obj = c.newInstance(); //获取成员变量 Class类的方法 getFields() c

java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况

/* 样例1: class Parent{ int num = 3; } class Child extends Parent{ int num = 4; } */ /* 样例2: class Parent{ } class Child extends Parent{ int num = 4; } */ /* 样例3: class Parent{ void show(){ System.out.println("Parent Show!"); } } class Child exten

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

通过反射,可以获取所有声明的成员变量(包括所有的),代码如下: package spt.test.src; public class Person { private String name = "pri_name"; public String id; } 运行测试: package spt.test; import java.lang.reflect.Field; import spt.test.src.Person; class ReflectionTest { @Suppres

【Java】+反射1+获取属性/成员变量 的名称及类型

扩展链接:[Java]+反射2+设置属性/成员变量 的值 1.目标类 2.获取目标群类中的属性及属性的类型 3.代码 1 @Test 2 public void testA() { 3 Class clazz = ZGXRequest.class; 4 // step1 获取类中所有的属性 5 Field[] fields = clazz.getDeclaredFields(); 6 for (Field field : fields) { 7 // step2 获取每个属性的类型(以点分割 需

Java之反射机制六:获取方法的泛型信息

一.测试类 public class Test02 { public void parameterTest(Map<Integer, Dog> map){ } public Map<Integer,Dog> returnTest(){ return new HashMap<Integer, Dog>(); } } 二.获取方法的参数中的泛型信息 @Test //获取方法的参数中的泛型信息 public void test() throws NoSuchMethodExc