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()));
}
我应该在过滤器中添加什么?
答案 0 :(得分:2)
您可以通过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()
返回的数组是否为空。