我正在寻找一种方法来获取扩展某个类并推断某些泛型的所有类。
我知道使用Reflections
我可以获得扩展一个类的所有类
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
为通用的内容 最佳答案
您可以先使用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>>>
从技术上讲应该只拥有类ClassBase
本身,而您实际上对子类感兴趣,因此您会得到Class<? extends ClassBase<Long>>
。关于java - 获取所有扩展类以推断某些泛型的类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50987234/