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