我正在用 Java 构建一个命令行应用程序,它具有取决于第一个选择的参数的动态参数列表。
java -jar cli.jar --optimizer DifferentialEvolution [optimizer options]
此应用程序中的优化器是通过实现接口来定义的InterfaceOptimizer
。使用反射库,我正在查找此接口的所有子类型,并选择与命令行中给出的名称匹配的子类型。
优化器的每个实现都有不同的参数,这些参数标有注释@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>
),我需要另一种方法来执行查找,因此不必为所有可参数化的复杂类型实现上述方法。
有什么建议吗?