代码之家  ›  专栏  ›  技术社区  ›  mik01aj

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

  •  11
  • mik01aj  · 技术社区  · 14 年前
    interface Foo<T> { ... }
    class Bar implements Foo<Baz> { ... }
    

    我有一个 Bar 对象。如何获取 T 为它( Baz )?

    到目前为止,我只获得了接口 T 但是我看不出一种方法来获得它的价值。

    事先谢谢。

    2 回复  |  直到 10 年前
        1
  •  20
  •   Bozho    14 年前
    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的评论)

        2
  •  0
  •   Dan Godfrey    10 年前

    如果类路径上已经有了guava,那么当您按类型而不是按索引指定接口/超类时,这就更加健壮了。

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