java从基接口获取所有扩展接口

时间:2017-10-17 17:42:09

标签: java reflection interface

是否有可能获得扩展基本接口的所有接口的列表,而没有任何 bean在java 运行时中实现任何接口?

示例:

interface A {}
interface B extends A{}
interface C extends A{}
interface D extends C{}

public Class<? extends A>[] getAllInterfaces(A.class);

方法getAllInterfaces()应返回所有扩展A:{B,C,D}

的接口

2 个答案:

答案 0 :(得分:3)

有点但不是真的。

您需要做的是枚举所有类型,并在其中查找接口和扩展接口的内容。 (使用Class#isInterfaceClass#getInterfaces。)

然而,真正的困难在于找到所有类型&#34;。这是否意味着JVM当前加载的所有类型?它是否意味着可以在当前类路径中找到所有类型?您可以从基本上任何源加载类,因此扩展您的接口的理论接口集是无限的。

顺便说一句,没有标准方法可以执行任何这些枚举。对于第一个变体,请参阅此主题:Java - Get a list of all Classes loaded in the JVM

答案 1 :(得分:1)

如果您不需要使用纯反射进行扫描,则可以使用Reflections库进行扫描。

检查同一类加载器上的后代接口的基本变体是:

public <T> Class<? extends T>[] getAllInterfaces(Class<T> clazz) {

    Reflections reflections = new Reflections(clazz.getClassLoader());

    return reflections.getSubTypesOf(clazz)
            .stream()
            .filter(subClass -> subClass.isInterface())
            .toArray(Class[]::new);
}

上述代码应根据您如何理解“所有类型”进行更新。您可能需要添加类加载器或进行其他一些调整。