2013-10-10 40 views
0

我正在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>),我需要另一種方式來進行查找所以不要必須爲所有可參數化的複雜類型實現上述方法。

有什麼建議嗎?

回答

0

給定的代碼是syntacly正確的,應該照原樣運行。要獲得更詳細的答案,請提供運行時錯誤或編譯器警告/錯誤。