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

使用反射的泛型类类型父级

  •  1
  • Kartik  · 技术社区  · 7 年前
    public class Parent {}
    
    public class A extends Parent {}
    
    public class B {}
    
    public class Test {
        private List<A> aList;
        private List<B> bList;
    }
    

    我在玩反射和泛型,创建这些类只是为了好玩。

    Test 类型的类 List<T extends Parent> . 所以我只想打印 "aList" 因为 A 延伸 Parent ,而 B

    List 变量。我查看了各种反射方法,但无法提取列表的类型 <...> 起源 不管怎样。这是我的代码,目前打印两个 "bList" :-

    public static void main(String[] args) {
        Arrays.stream(Test.class.getDeclaredFields())
                .filter(field -> field.getType().equals(List.class)) // && fieldActualTypeExtendsA
                .forEach(field -> System.out.println(field.getName()));
    }
    

    我应该在过滤器中添加什么?

    1 回复  |  直到 7 年前
        1
  •  2
  •   cgrim    7 年前

    field.getGenericType() 它返回 ParameterizedType 类的方法在哪里 getActualTypeArguments() List Map

    然后,按父级筛选的代码可以如下所示:

    Arrays.stream(Test.class.getDeclaredFields())
            .filter(field -> field.getType().equals(List.class)
                    && field.getGenericType() instanceof ParameterizedType
                    && ((Class) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]).getSuperclass().equals(Parent.class))
            .forEach(field -> System.out.println(field.getName()));
    

    当然,您可以添加一些安全检查—例如 getActualTypeArguments()