2013-10-08 12 views
6

Sto utilizzando il pacchetto reflections per ottenere un set di classi che implementano una determinata interfaccia. Questo set sarà usato come una lista di possibili opzioni da linea di comando. Il mio problema è che ho solo voglia di ottenere classi istanziabili, ma in questo momento ottenere entrambe le classi istanziabili e non istanziabili (ad esempio le classi astratte) dal codice seguente:Come ottenere solo classi istantanee con riflessioni

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); 
} 

C'è un modo per filtrare il set restituito da getSubTypesOf per filtrare le classi astratte?

+0

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

+0

@rusmus, ho chiesto espressamente per non-instantiable le classi e le classi astratte sono solo un esempio di ciò. Certo, la domanda che hai collegato copre abbastanza bene le classi astratte, ma non sapevo come controllare le interfacce. – halfdan

risposta

15

Utilizzare il metodo isInterface() di distinguere tra classi e interfacce.

Utilizzare Modifier.isAbstract(getClass().getModifiers()); per indicare se la classe è abstract oppure no.

+0

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

3

Si può provare questo

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

oltre ha senso per verificare se la classe ha un costruttore senza args

+1

Grazie! Mi piacerebbe anche accettare la tua risposta, ma ho scelto Adams semplicemente perché preferisco il metodo isAbstract. – halfdan