2010-08-31 128 views
11
interface Foo<T> { ... } 
class Bar implements Foo<Baz> { ... } 

我有一个Bar对象。如何得到它的价值TBaz)?如何使用java反射获取类型参数值?

到目前为止,我只设法获得界面和T,但我看不到一种方法来获得它的价值。

在此先感谢。

回答

20
Type type = bar.getClass().getGenericInterfaces()[0]; 

if (type instanceof ParameterizedType) { 
    Type actualType = ((ParameterizedType) type).getActualTypeArguments()[0]; 
    System.out.println(actualType); 
} 

当然,在一般情况下,应该迭代阵列上,而不是假定它有excatly一个元件([0])。通过以上示例,您可以将actualType转换为java.lang.Class。在其他情况下,它可能会有所不同(请参见评论)

+3

注意,在一般情况下,'actualType'不一定是简单的'java.lang.Class' - 它也可能是一个'GenericArrayType',一个'ParametrizedType',或'TypeVariable'。 – meriton 2010-08-31 18:15:12

+0

是的。我的意思是他的情况是'Class'。 – Bozho 2010-08-31 19:13:00

0

如果您已经在类路径中包含Guava,那么您可以通过类型而不是索引来指定接口/超类。

TypeToken<?> baz = TypeToken.of(Bar.class).resolveType(Foo.class.getTypeParameters()[0]); 
System.out.println(baz.getRawType()); // class Baz