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

我正在寻找一种方法来获取扩展某个类并推断某些泛型的所有类。我知道使用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,他们都在延伸ClassBase


public 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为通用的


幕布斯6054654
浏览 160回答 2
2回答

临摹微笑

您可以通过使用函数来查看推断的泛型类型getGenericSuperclass,然后再看getActualTypeArguments一个示例:// Given that all classes in this set are actually subclasses of ClassBaseSet<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()&nbsp; &nbsp; .filter(cls -> {&nbsp; &nbsp; &nbsp; &nbsp; // Get superclass, which is ClassBase, so assume it's also parameterized&nbsp; &nbsp; &nbsp; &nbsp; ParameterizedType superClass = (ParameterizedType) cls.getGenericSuperclass();&nbsp; &nbsp; &nbsp; &nbsp; Type inferred = superClass.getActualTypeArguments()[0]; // get first type argument&nbsp; &nbsp; &nbsp; &nbsp; return inferred == Long.class; // check if it's 'Long'&nbsp; &nbsp; })&nbsp; &nbsp; // Can now say they all extend ClassBase<Long>&nbsp; &nbsp; .map(cls -> (Class<? extends ClassBase<Long>>) cls)&nbsp; &nbsp; .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>>。

阿波罗的战车

对于使用的弹簧人,并将这些类由容器管理(它们标注有一些春天注解喜欢@Service,@Component),你可以得到所有用以下方法的类:@Inject&nbsp;Set&nbsp;<ClassBase&nbsp;<Long>>&nbsp;extensionsWithLongType;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java