命令行应用程序的动态子类型查找

时间:2013-10-10 14:55:23

标签: java reflection command-line-interface

我正在Java中构建一个命令行应用程序,它具有动态的参数列表,具体取决于第一个选择的参数。

java -jar cli.jar --optimizer DifferentialEvolution [optimizer options]

通过实现接口InterfaceOptimizer定义此应用程序中的优化器。使用reflections库我正在查找此接口的所有子类型,并选择与命令行中给出的名称匹配的那个。

优化程序的每个实现都有不同的参数,这些参数标有注释@Parameter(name = 'cli-name', description = "Some option")。参数可以是易于处理的简单类型或复杂类型。对于所有复杂类型,我需要执行与优化器相同的子类型查找:

public static Map<String, Class<? extends InterfaceOptimizer>> createOptimizerList() {
    Map<String, Class<? extends InterfaceOptimizer>> optimizerList = new TreeMap<String, Class<? extends InterfaceOptimizer>>();

    Reflections reflections = new Reflections("eva2.optimization.strategies");
    Set<Class<? extends InterfaceOptimizer>> optimizers = reflections.getSubTypesOf(InterfaceOptimizer.class);
    for(Class<? extends InterfaceOptimizer> optimizer : optimizers) {
        // We only want instantiable classes
        if(optimizer.isInterface() || Modifier.isAbstract(optimizer.getModifiers())) {
            continue;
        }
        optimizerList.put(optimizer.getSimpleName(), optimizer);
    }
    return optimizerList;
}

由于java无法处理动态泛型(Class type = Foobar.class; Class<? extends type>),我需要另一种方法来执行查找,因此不必为所有可参数化的复杂类型实现上述方法。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

给定的代码是完全正确的,应该按原样运行。有关更详细的解答,请提供运行时错误或编译器警告/错误。