2013-10-08 54 views
6

我正在使用reflections包獲取一組實現某個接口的類。該組將用作可能的命令行選項列表。我的問題是,我只是想獲得實例化類,但現在從下面的代碼同時獲得實例化和不可實例化類(比如抽象類):如何獲得僅具有反射的可實例化的類

Map<String, Class<? extends InterfaceOptimizer>> optimizerList = new HashMap<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) { 
    optimizerList.put(optimizer.getName(), optimizer); 
} 

有沒有辦法來過濾返回的集getSubTypesOf過濾掉抽象類?

+0

請參閱http://stackoverflow.com/questions/1072890/how-can-i-determine-whether-a-java-class-is-abstract-by-reflection – rusmus

+0

@rusmus,我特別要求不可實例化類和抽象類只是其中的一個例子。當然,你鏈接的問題涵蓋了抽象類很好,但我不知道如何檢查接口。 – halfdan

回答

15

使用isInterface()方法的類和接口之間進行區分。

使用Modifier.isAbstract(getClass().getModifiers());來判斷班級是否爲abstract

+0

if(Modifier.isAbstract(myclass.getModifiers())|| myclass.isInterface()) – fl0w

3

你可以試試這個

cls.getModifiers() & Modifier.ABSTRACT == 0 && !cls.isInterface() 

除了是有意義的檢查類有一個無參數的構造函數

+1

謝謝!我也很樂意接受你的回答,但只是因爲我更喜歡isAbstract方法而選擇了Adams。 – halfdan

相關問題