【问题标题】:How to reflect and load all classes that implements specific interface [duplicate]如何反映和加载实现特定接口的所有类[重复]
【发布时间】:2019-10-16 01:24:52
【问题描述】:

我正在尝试加载和创建所有实现特定的类

使用反射的java接口?

说我有:

package Test;

interface foo {}
class one implements foo {
}
class two implements foo {
}

怎么做?

你能帮忙吗?

【问题讨论】:

  • 寻找 ServiceLoader 机制。上面提到的答案(#2)中有一个不错的解释,但可以找到更好的解释

标签: java


【解决方案1】:

您可以查看特定的包和iterate in all classes (我只是复制并粘贴代码,点击链接)。然后,您测试它是否使用specific interface

public static void main(String[] args) throws Exception{
   List<Class> classes = getClasses(ClassWithMain.class.getClassLoader(), "fr/jamailun/test");
   for(Class c : classes){
      for(Class i : c.getInterfaces()) {
         if(i.isAssignableFrom(FooInterface.class)) {
            System.out.println("The class " + c + "implements interface "+FooInterface);
            //your code then
         }
      }
   }
}

public static List<Class> getClasses(ClassLoader cl, String pack) throws Exception {
   String dottedPackage = pack.replaceAll("[/]", ".");
   List<Class> classes = new ArrayList<>();
   URL uPackage = cl.getResource(pack);
   DataInputStream dis = new DataInputStream((InputStream) uPackage.getContent());
   String line;
   while ((line = dis.readLine()) != null) {
      if(line.endsWith(".class")) {
          classes.add(Class.forName(dottedPackage+"."+line.substring(0,line.lastIndexOf('.'))));
      }
   }
   return classes;
}

请注意,“ClassWithMain”在这里是包含此主要方法的类:可以在任何地方,只需更改名称即可。

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 2013-12-24
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2010-10-16
    • 2013-09-27
    • 2016-05-13
    相关资源
    最近更新 更多