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