代码之家  ›  专栏  ›  技术社区  ›  Roman

如何找到某个接口的所有实现?

  •  2
  • Roman  · 技术社区  · 14 年前

    我想让我的程序初始化变得更“智能”。

    我有几个代表命令的类。所有这些类都是不可变的(即,对于整个应用程序来说,只创建每个类的一个实例就足够了)。所有这些类都实现 Command 接口。

    我认为,一些类与一个带有main方法的类放在同一个jar中(甚至可能放在一个预定义的包中),并且这些类实现了一个已知的接口,这一事实应该提供足够的信息,使自动创建它们的实例成为可能。

    如何实现此功能?(很明显,它与反射紧密相连,也可能与java类加载机制紧密相连,但我不是这些领域的专家)。


    我想要这样的东西:

    public static void init() {
       ...
       Map<String, Command> commands = Maps.newHashMap();
       for (Class clazz : findCommandImplementationsInThisJarFile()) {
            //some try/catch stuff is ommited
            Command command = clazz.newInstance();
            commands.put(command.getName(), command);
       }
       ...
    }
    

    如何实现复杂的方法 findCommandImplementationsInThisJarFile() ?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Pablojim    14 年前

    你需要extcos:

    select(javaClasses()).from("your.package").returning(allAnnotatedWith(YourAnnotation.class))

    也支持实现和扩展等。。。

    http://sourceforge.net/projects/extcos/

    Spring还包含类似的代码,用于容易适应的组件扫描。