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()));}我应该在过滤器中添加什么?
1 回答
哔哔one
TA贡献1854条经验 获得超8个赞
您可以访问字段泛型类型,通过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()为空。
添加回答
举报
0/150
提交
取消