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

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"因为Aextends Parent,而 whileB没有。


到目前为止,我已经能够获得List变量。我查看了各种反射方法,但无法提取 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()));

}

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


HUX布斯
浏览 118回答 1
1回答

哔哔one

您可以访问字段泛型类型,通过field.getGenericType()它返回ParameterizedType类的实现,其中方法getActualTypeArguments()返回类型参数。这是可用的List,Map等然后您的父级过滤代码可能如下所示:Arrays.stream(Test.class.getDeclaredFields())&nbsp; &nbsp; &nbsp; &nbsp; .filter(field -> field.getType().equals(List.class)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; && field.getGenericType() instanceof ParameterizedType&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; && ((Class) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]).getSuperclass().equals(Parent.class))&nbsp; &nbsp; &nbsp; &nbsp; .forEach(field -> System.out.println(field.getName()));您当然可以添加一些安全检查 - 例如返回的数组是否getActualTypeArguments()为空。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java