使用反射访问类型参数

时间:2010-12-30 19:19:04

标签: java reflection

如何使用反射找到传递给超类的类型参数值?

例如,给定Bar.class,如何找到它将Integer.class传递给Foo的类型参数T

public class Foo<T> {
}

public class Bar extends Foo<Integer> {
}

谢谢!

2 个答案:

答案 0 :(得分:2)

public class Bar extends Foo<Integer> {

 public Class getTypeClass {
   ParameterizedType parameterizedType =
     (ParameterizedType) getClass().getGenericSuperClass();
  return (Class) parameterizedtype.getActualTypeArguments()[0];
 }

}

上面给出的应该适用于大多数实际情况,但不能保证,因为类型擦除,没有办法直接这样做。

答案 1 :(得分:1)

你可以尝试

ParameterizedType type = (ParameterizedType) Bar.class.getGenericSuperclass();
System.out.println(type.getRawType()); // prints; class Foo
Type[] actualTypeArguments = type.getActualTypeArguments();
System.out.println(actualTypeArguments[0]); // prints; class java.lang.Integer

这只能起作用,因为Bar是一个扩展特定Foo的类。如果您声明了如下所示的变量,则无法在运行时确定intFoo的参数类型。

Foo<Integer> intFoo = new Foo<Integer>();