以编程方式获取通用声明的值?

时间:2015-07-21 14:02:24

标签: java generics reflection

我按如下方式声明一个类:

public class SomeClass extends AdditionalClass<GenericClass> {
  ...
}

此...

SomeClass object = new SomeClass();
System.out.println(object.getSuperClass().getSimpleName());

... yield&#34; AdditionalClass&#34;。什么方法调用或调用将允许我询问该对象并获得&#34; GenericClass&#34;结果呢?

1 个答案:

答案 0 :(得分:14)

你必须获取超类的ParameterizedType(s)数组。例如:

SomeClass object = new SomeClass();
Type parameterizedClassType = 
         ((ParameterizedType) object.getClass().getGenericSuperclass())
         .getActualTypeArguments()[0];
System.out.println(parameterizedClassType.getTypeName());

这应该打印com.whateverpackage.GenericClass

请注意,即使在编译SomeClass时发生类型擦除,也会保留有关超类的类型参数信息,因为它们是类的定义的 part

但是,如果SomeClass是通用的(即类似SomeClass<X> extends AdditionalClass<GenericClass>),则对于所有SomeClass个实例,type-parameter(即<X>)将已被某些实际类型替换,不会成为.getActualTypeParameters()数组的一部分。