如何使用java反射获取类型参数值?

时间:2010-08-31 14:07:41

标签: java generics reflection

interface Foo<T> { ... }
class Bar implements Foo<Baz> { ... }

我有一个Bar对象。如何获取T的价值(Baz)?

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

提前致谢。

2 个答案:

答案 0 :(得分:20)

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

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

当然,在一般情况下,你应该迭代数组,而不是假设它有一个元素([0])。通过上面的示例,您可以将actualType投射到java.lang.Class。在其他情况下,它可能会有所不同(请参阅meriton的评论)

答案 1 :(得分:0)

如果你已经在类路径上安装了Guava,那么当你按类型而不是索引指定接口/超类时,这会更加健壮。

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