使用Reflection检索Generic Type实例中使用的类

时间:2017-04-29 21:52:28

标签: java reflection

假设您的包中声明了类型Pair<K,V>。给定一个对象实例:

 Pair<Integer, Integer> obj = new Pair<>(1,23);

我想检索分别与IntegerInteger相关联的类型参数KV。顺便说一句,似乎是使用Java标准反射我无法使用Java中的实例访问实际的类。

 TypeVariable<? extends Class<?>>[] parameters = obj.getClass().getTypeParameters();

我没有设法使用这些参数提取所需的信息。我开始怀疑,类型信息可能仅在编译时保留,而在运行时,实际的类型参数信息被删除。

2 个答案:

答案 0 :(得分:1)

如果您只有一个实例,例如:Pair<Integer, Integer> pair = new Pair<>(1,23),则无法获取静态泛型类型,因为该信息在运行时会丢失。

另一方面,如果Pair<Integer, String>是字段的类型,方法返回类型,方法参数的类型,或者如果泛型类型参数来自超类,则可以提取静态泛型类型。

检查my answer here以获取有关在这些情况下提取泛型类型的示例。

除此之外,您只能检查运行时值的动态类型,如Yahya所述。

答案 1 :(得分:0)

请考虑这个答案:

public static String[] getArgumentType(Object obj){
    String[] type = new String[2];
    type[0]=((Pair<?, ?>) obj).getKey().getClass().getName().replace("java.lang.", "");
    type[1]=((Pair<?, ?>) obj).getValue().getClass().getName().replace("java.lang.", "");
    return type;
}

 public static void main(String[] args) {
    Pair<String,Integer> obj = new Pair<String,Integer>("", 2);
    String[] type = getArgumentType(obj);
    System.out.println(type[0] + ", " + type[1]);
    Pair<Integer,Integer> obj1 = new Pair<Integer,Integer>(1, 2);
    type = getArgumentType(obj1);
    System.out.println(type[0] + ", " + type[1]);
    Pair<Double,Float> obj2 = new Pair<Double,Float>(1.1, 2.2f);
    type = getArgumentType(obj2);
    System.out.println(type[0] + ", " + type[1]);
    Pair<Person,Object> obj3 = new Pair<Person,Object>(new Person(), new Object());
    type = getArgumentType(obj3);
    System.out.println(type[0] + ", " + type[1]);
}

输出:

String, Integer
Integer, Integer
Double, Float
Person, Object