我正在Java中構建一個命令行應用程序,該應用程序具有動態的參數列表,具體取決於第一個選定的參數。命令行應用程序的動態子類型查找
java -jar cli.jar --optimizer DifferentialEvolution [optimizer options]
在本申請中所述的優化器是通過實現接口InterfaceOptimizer
定義。使用reflections庫,我正在查找此接口的所有子類型,並選擇與命令行中給出的名稱相匹配的子類型。
優化程序的每個實現都有不同的參數,這些參數用annotaction @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>
),我需要另一種方式來進行查找所以不要必須爲所有可參數化的複雜類型實現上述方法。
有什麼建議嗎?