Java 获取泛型信息


获取泛型信息

  • ParameterizedType 接口可以用来获取泛型参数信息,如泛型类、泛型方法、泛型接口的;
  • 提供的 getActualTypeArguments() 方法是返回表示此类型实际类型参数的 Type 对象的数组;
  • java.lang.reflect,详见:Interface ParameterizedType

1. Java 实例

  • 获取指定类的 Class 类对象 cf;
  • 指定成员变量 gc 的泛型参数类型 t;
  • 若 t 属于 ParameterizedType 接口类型,获取实际类型参数的对象数组 pt;
  • 利用反射获取泛型方法,返回值泛型参数信息;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

public class test {
    //定义类的成员变量,类型是泛型类GenericClass
    private GenericClass<String, Integer, Double> gc;

    public static void main(String args[]) {
        try {
            //获取指定类的Class类对象cf
            Class cf = Class.forName("test");
            //利用反射获取泛型类的参数信息
            Field field = cf.getDeclaredField("gc");
            //指定成员变量gc的泛型参数类型t
            Type t = field.getGenericType();
            //若t属于ParameterizedType接口类型
            if (t instanceof ParameterizedType) {
                //获取实际类型参数的对象数组pt
                System.out.println("---泛型类信息---");
                Type[] pt = ((ParameterizedType) t).getActualTypeArguments();
                for (Type tt : pt) {
                    System.out.println(tt);
                }
            }
            //利用反射获取泛型方法:返回值泛型参数信息
            Class c = Class.forName("GenericClass");
            System.out.println("---泛型方法信息---");
            Type type = c.getMethod("getMyParams").getGenericReturnType();
            System.out.println(type.toString());
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}

class GenericClass<String, Integer, Double> {
    private List<String> myParams;
    public List<String> getMyParams() {
        return myParams;
    }
}
/*
输出
---泛型类信息---
class java.lang.String
class java.lang.Integer
class java.lang.Double
---泛型方法信息---
java.util.List<String>
 */
发布了185 篇原创文章 · 获赞 181 · 访问量 5380

猜你喜欢

转载自blog.csdn.net/Regino/article/details/104649098