美文网首页
Java使用反射来获取泛型信息(转)

Java使用反射来获取泛型信息(转)

作者: dinel | 来源:发表于2020-02-07 13:54 被阅读0次

    来自:http://c.biancheng.net/view/6916.html

    通过指定类对应的 Class 对象,可以获得该类里包含的所有成员变量,不管该成员变量是使用 private 修饰,还是使用 public 修饰。获得了成员变量对应的 Field 对象后,就可以很容易地获得该成员变量的数据类型,即使用如下代码即可获得指定成员变量的类型。

    // 获取成员变量 f 的类型
    Class<?> a = f.getType();
    

    但这种方式只对普通类型的成员变量有效。如果该成员变量的类型是有泛型类型的类型,如 Map<String, Integer>类型,则不能准确地得到该成员变量的泛型参数。

    为了获得指定成员变量的泛型类型,应先使用如下方法来获取该成员变量的泛型类型。

    // 获得成员变量f的泛型类型
    Type gType = f.getGenericType();
    

    然后将 Type 对象强制类型转换为 ParameterizedType 对象,ParameterizedType 代表被参数化的类型,也就是增加了泛型限制的类型。ParameterizedType 类提供了如下两个方法。
    getRawType():返回没有泛型信息的原始类型。
    getActualTypeArguments():返回泛型参数的类型。

    下面是一个获取泛型类型的完整程序。

    public class GenericTest {
        private Map<String, Integer> score;
        public static void main(String[] args) throws Exception {
            Class<GenericTest> clazz = GenericTest.class;
            Field f = clazz.getDeclaredField("score");
            // 直接使用getType()取出类型只对普通类型的成员变量有效
            Class<?> a = f.getType();
            // 下面将看到仅输出java.util.Map
            System.out.println("score 的类型是:" + a);
            // 获得成员变量f的泛型类型
            Type gType = f.getGenericType();
            // 如果 gType 类型是 ParameterizedType对象
            if (gType instanceof ParameterizedType) {
                // 强制类型转换
                ParameterizedType pType = (ParameterizedType) gType;
                // 获取原始类型
                Type rType = pType.getRawType();
                System.out.println("原始类型是:" + rType);
                // 取得泛型类型的泛型参数
                Type[] tArgs = pType.getActualTypeArguments();
                System.out.println("泛型信息是:");
                for (int i = 0; i < tArgs.length; i++) {
                    System.out.println("第" + i + "个泛型类型是:" + tArgs[i]);
                }
            } else {
                System.out.println("获取泛型类型出错!");
            }
        }
    }
    

    上面程序中的第 12、16、18 和 21 行代码就是取得泛型类型的关键代码。运行上面程序,将看到如下运行结果:
    score 的类型是:interface java.util.Map
    原始类型是:interface java.util.Map
    泛型信息是:
    第0个泛型类型是:class java.lang.String
    第1个泛型类型是:class java.lang.Integer
    从上面的运行结果可以看出,使用 getType() 方法只能获取普通类型的成员变量的数据类型。对于增加了泛型的成员变量,应该使用 getGenericType() 方法来取得其类型。

    提示:Type 也是 java.lang.reflect 包下的一个接口,该接口代表所有类型的公共高级接口,Class 是 Type 接口的实现类。Type 包括原始类型、参数化类型、数组类型、类型变量和基本类型等。

    相关文章

      网友评论

          本文标题:Java使用反射来获取泛型信息(转)

          本文链接:https://www.haomeiwen.com/subject/wppmxhtx.html