是否有可能获得扩展基本接口的所有接口的列表,而没有任何 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}
答案 0 :(得分:3)
有点但不是真的。
您需要做的是枚举所有类型,并在其中查找接口和扩展接口的内容。 (使用Class#isInterface
和Class#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);
}
上述代码应根据您如何理解“所有类型”进行更新。您可能需要添加类加载器或进行其他一些调整。