使用反射的泛型类父

时间:2018-10-15 04:37:50

标签: java generics reflection

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变量。我研究了各种反射方法,但无法提取列表<...>的类型,并查看其超类是否为Parent。这是我的代码,目前同时显示"aList""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 个答案:

答案 0 :(得分:2)

您可以通过field.getGenericType()访问字段通用类型,该类型返回ParameterizedType类的实现,其中方法getActualTypeArguments()返回类型参数。这可用于ListMap

然后,您要按父级过滤的代码如下所示:

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()返回的数组是否为空。