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

获取所有扩展类以推断某些泛型的类

获取所有扩展类以推断某些泛型的类

幕布斯6054654 2021-03-30 13:14:49
我正在寻找一种方法来获取扩展某个类并推断某些泛型的所有类。我知道使用Reflectionsi可以获取扩展一个类的所有类final Reflections reflections = new Reflections("path.to.package");Set<Class<? extends ClassBase>> classes = reflections.getSubTypesOf(ClassBase.class);但是我不确定如何只使用某些泛型。这是我想要实现的示例假设我有 ClassBase<T>public class ClassBase<T> {}然后我有了ClassA ClassB ClassC,他们都在延伸ClassBasepublic class ClassA extends ClassBase<Long> {}public class ClassB extends ClassBase<Long> {}public class ClassC extends ClassBase<Integer> {}我怎么只得到ClassA和ClassB?我什至可以接受所有扩展的类,ClassBase然后过滤掉我不需要的那些类,只要我最终得到的集合中只包含那些扩展ClassBase并推断<Long>为泛型类型的类即可。或者更好的是,我实际上想要的Set<Class<ClassBase<Long>>>不仅仅是一个Set<Class<ClassBase>>只包含那些推断Long为通用的
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

您可以通过使用函数来查看推断的泛型类型getGenericSuperclass,然后再看getActualTypeArguments一个示例:


// Given that all classes in this set are actually subclasses of ClassBase

Set<Class<? extends ClassBase>> classes = Set.of(ClassA.class, ClassB.class, ClassC.class);

System.out.println(classes); // [class test.ClassB, class test.ClassA, class test.ClassC]


@SuppressWarnings("unchecked")

Set<Class<? extends ClassBase<Long>>> result = classes.stream()

    .filter(cls -> {

        // Get superclass, which is ClassBase, so assume it's also parameterized

        ParameterizedType superClass = (ParameterizedType) cls.getGenericSuperclass();

        Type inferred = superClass.getActualTypeArguments()[0]; // get first type argument

        return inferred == Long.class; // check if it's 'Long'

    })

    // Can now say they all extend ClassBase<Long>

    .map(cls -> (Class<? extends ClassBase<Long>>) cls)

    .collect(Collectors.toSet());


System.out.println(result); // [class test.ClassA, class test.ClassB]

您将获得一个Set<Class<? extends ClassBase<Long>>>包含扩展类的ClassBase<Long>。Set<Class<ClassBase<Long>>>您所要求的A ,从技术上讲应该只拥有该类ClassBase本身,而您实际上对子类却很感兴趣,因此您可以得到Class<? extends ClassBase<Long>>。


查看完整回答
反对 回复 2021-04-21
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

对于使用的弹簧人,并将这些类由容器管理(它们标注有一些春天注解喜欢@Service@Component),你可以得到所有用以下方法的类:

@Inject Set <ClassBase <Long>> extensionsWithLongType;


查看完整回答
反对 回复 2021-04-21
  • 2 回答
  • 0 关注
  • 159 浏览

添加回答

举报

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