11
interface Foo<T> { ... }
class Bar implements Foo<Baz> { ... }
我有一個Bar
對象。如何得到它的價值T
(Baz
)?如何使用java反射獲取類型參數值?
到目前爲止,我只設法獲得界面和T
,但我看不到一種方法來獲得它的價值。
在此先感謝。
interface Foo<T> { ... }
class Bar implements Foo<Baz> { ... }
我有一個Bar
對象。如何得到它的價值T
(Baz
)?如何使用java反射獲取類型參數值?
到目前爲止,我只設法獲得界面和T
,但我看不到一種方法來獲得它的價值。
在此先感謝。
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
。在其他情況下,它可能會有所不同(請參見評論)
如果您已經在類路徑中包含Guava,那麼您可以通過類型而不是索引來指定接口/超類。
TypeToken<?> baz = TypeToken.of(Bar.class).resolveType(Foo.class.getTypeParameters()[0]);
System.out.println(baz.getRawType()); // class Baz
注意,在一般情況下,'actualType'不一定是簡單的'java.lang.Class' - 它也可能是一個'GenericArrayType',一個'ParametrizedType',或'TypeVariable'。 – meriton 2010-08-31 18:15:12
是的。我的意思是他的情況是'Class'。 – Bozho 2010-08-31 19:13:00