2013-10-08 11 views
6

Używam pakietu reflections, aby uzyskać zestaw klas, które implementują określony interfejs. Ten zestaw będzie używany jako lista możliwych opcji wiersza poleceń. Moim problemem jest to, że chcę tylko, aby zajęcia chwilowe, ale teraz dostać zarówno chwilowe i nie chwilowe klas (np klasy abstrakcyjne) z następującego kodu:Jak uzyskać tylko natychmiastowe klasy z odbiciami

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

Czy istnieje sposób, aby filtrować zestaw zwrócony przez getSubTypesOf, aby odfiltrować klasy abstrakcyjne?

+0

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

+0

@rusmus, specjalnie poprosiłem o brak możliwości klasy i klasy abstrakcyjne są tylko jednym z przykładów. Oczywiście pytanie, które łączysz, całkiem dobrze opisuje klasy abstrakcyjne, ale nie wiedziałem, jak sprawdzić interfejsy. – halfdan

Odpowiedz

15

użyć metody isInterface() rozróżnienia klas i interfejsów.

Użyj Modifier.isAbstract(getClass().getModifiers());, aby powiedzieć, czy klasa jest abstract czy nie.

+0

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

3

Można spróbować tej

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

oprócz warto sprawdzić, czy klasa ma no-args konstruktor

+1

Dzięki! Chciałbym również przyjąć twoją odpowiedź, ale wybrałem Adamsa po prostu dlatego, że wolę metodę isAbstract. – halfdan

Powiązane problemy