2010-08-31 122 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