2010-10-30 35 views
2

我想让我的程序初始化有点“更聪明”。如何查找某个接口的所有实现?

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

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

我该如何实现此功能? (很明显,它与反射紧密相关,也许与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()

回答

2

您需要extcos:

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

还支持thoseImplementing和thoseExtending等等

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

Spring也包含类似的代码为它的组件扫描是很容易适应。

+0

酷!我喜欢。它具有必要的功能,使用简单,(我几乎可以肯定)调查实施会非常有趣(因为我自己还不知道如何做同样的事情)。 – Roman 2010-10-30 22:16:48

相关问题