Java 使用反射检索泛型类型实例中使用的类

Java 使用反射检索泛型类型实例中使用的类,java,reflection,Java,Reflection,假设在包中声明了一个类型对。给定以下对象实例: Pair<Integer, Integer> obj = new Pair<>(1,23); 我没有使用这些参数提取出所需的信息。我开始怀疑,可能类型信息只在编译时保留,而在运行时实际的类型参数信息被删除

假设在包中声明了一个类型
。给定以下对象实例:

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

我没有使用这些参数提取出所需的信息。我开始怀疑,可能类型信息只在编译时保留,而在运行时实际的类型参数信息被删除
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]);
}

如果您只有一个实例,例如:
pairpair=newpair(1,23)
,则无法获取静态泛型类型,因为该信息在运行时丢失

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

检查在这些情况下提取泛型类型的示例


除此之外,您只能在运行时检查值的动态类型,正如所解释的。

因此,您只需要在Pair对象中正确地检查type参数的类型,在您的示例中,
Integer
。我只是设法从类型参数中检索K和V,但我没有得到与此类参数关联的实际类。Is始终是一个类似于原语的类型(即
整数
字符串
。等),或者它可能是一个对象类型(例如
类人
)?它甚至可能是一个对象类型。由于在我的上下文应用程序中,我不需要实际的类,所以可能的重复是可以的…但是,没有办法通过使用反射获得相同的结果,这比解析字符串更干净吗?另外,Pair只是一个示例,我甚至可以有不同的类和其他类型的类,我不知道类型参数和getter之间的关联。
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