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

Java 获取所有扩展类推断某些泛型的类,java,generics,Java,Generics,我正在寻找某种方法来获取扩展某个类的所有类,并推断出某些泛型。 我知道使用反射可以得到扩展类的所有类 final Reflections reflections = new Reflections("path.to.package"); Set<Class<? extends ClassBase>> classes = reflections.getSubTypesOf(ClassBase.class); 如何仅获取ClassA和ClassB?我甚至可以获取所有扩展了C

我正在寻找某种方法来获取扩展某个类的所有类,并推断出某些泛型。 我知道使用
反射
可以得到扩展类的所有类

final Reflections reflections = new Reflections("path.to.package");
Set<Class<? extends ClassBase>> classes = reflections.getSubTypesOf(ClassBase.class);
如何仅获取
ClassA
ClassB
?我甚至可以获取所有扩展了
ClassBase
的类,然后过滤掉我不需要的类,只要我最终得到一个只包含那些扩展了
ClassBase
的类的集合,并推断
为泛型类型。

或者更好,我实际上想要一个
而不仅仅是一个
,它只包含那些推断为泛型的

,您可以使用函数查看推断的泛型类型,下面是一个示例:

// 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]
//假设此集合中的所有类实际上都是ClassBase的子类

为使用spring的人设置,并让这些类由容器管理(它们用一些spring注释进行注释,如
@Service
@Component
),您可以通过以下方法获得所有类:

@Inject Set <ClassBase <Long>> extensionsWithLongType; 
@injectset-extensionsWithLongType;
// 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]
@Inject Set <ClassBase <Long>> extensionsWithLongType;