2013-10-08 2 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

Спасибо! Хотелось бы также принять ваш ответ, но выбрал Adams просто потому, что предпочитаю метод isAbstract. – halfdan

Смежные вопросы