为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUX布斯 2021-11-17 17:21:52
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()为空。


查看完整回答
反对 回复 2021-11-17
  • 1 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信