【问题标题】:java get all extended interfaces from base interfacejava从基接口获取所有扩展接口
【发布时间】:2018-03-29 11:52:45
【问题描述】:

是否有可能获得扩展基本接口的所有接口列表没有任何 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}

【问题讨论】:

    标签: java reflection interface


    【解决方案1】:

    有点,但不是真的。

    您需要做的是枚举所有类型,并在其中找到属于接口的东西并扩展您的接口。 (使用Class#isInterfaceClass#getInterfaces。)

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

    顺便说一句,没有标准的方法来进行这些枚举。对于第一个变体,请参阅此线程:Java - Get a list of all Classes loaded in the JVM

    【讨论】:

      【解决方案2】:

      如果您不需要使用纯反射进行扫描,则可以使用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);
      }
      

      上面的代码应该根据你对“所有类型”的理解来更新。您可能需要添加类加载器或进行一些其他调整。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-22
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 2012-10-23
        • 2011-01-14
        • 2012-12-19
        • 2020-11-29
        相关资源
        最近更新 更多