2016-11-10 4 views
3

Я пытаюсь использовать Reflections (как предусмотрено org.reflections) для обработки тяжелой работы, поэтому мне не нужно вручную создавать экземпляр для каждого класса в очень длинном списке. Тем не менее, Reflections не нацеливает классы так, как я ожидал, что вызывает некоторые проблемы.Отражение Java с дочерними классами

Мой текущий код Размышления:

Reflections reflections = new Reflections(this.getClass().getPackage().getName() + ".command.defaults"); 
Set<Class<? extends Command>> commandClasses = reflections.getSubTypesOf(Command.class); 

// Iterate through all the detected/found classes 
for (Class c : commandClasses) { 
    // If a class is abstract, ignore it. 
    if (Modifier.isAbstract(c.getModifiers())) { 
     continue; 
    } 

    // Attempt to create an instance of the class/command whatever. 
    try { 
     c.newInstance(); 
    } catch (InstantiationException | IllegalAccessException ex) { 
     // For once, the right thing to do is just ignore the exception. 
     // If a command is loaded but we can't create an instance or we 
     // can't access it, just skip. But, we'll at least log it (for now). 

     ex.printStackTrace(); 
    } 
} 

По сути, моя программа имеет все команды, присутствующие в com.example.command.defaults, где они поделенным на ряд вспомогательных пакетов только для визуальной группировки. Каждая команда находится в своем классе, где она расширяет один из трех абстрактных классов в com.example.command: PlayerCommand, SimpleCommand или просто Command. PlayerCommand и SimpleCommand также распространяются Command.

С моей точки зрения, reflections.getSubTypesOf(Command.class) должен позволять мне нацеливать любой класс, который в любом случае расширяет Command, но он, похоже, не работает таким образом. Используя мой инструмент отладчика, я заметил, что только один класс (который распространяется только Command) фактически считывается системой.

Как я могу сделать код отражений целевым для всех классов, которые расширяют Command и любые классы, расширяющие класс, который расширяет Command?

+0

У вас есть ссылка на документ Java для этой библиотеки? – markspace

+0

Поскольку Google кажется слишком большим для вас @markspace ... http://static.javadoc.io/org.reflections/reflections/0.9.10/org/reflections/Reflections.html – BlackHatSamurai

+0

Предполагая, что 'PlayerCommand' и' SimpleCommand' находятся в пакете 'com.example.command', вы должны использовать' com.example.command' как имя пакета вместо 'com.example.command.defaults' –

ответ

0

Acording к документации API, getSubTypesOf(Class<T> type) получает все вложенные типы в иерархии данного типа, но это также статистика, что это «зависит от SubTypesScanner настроенного».

Проблема в том, что не все классы загружаются и известны загрузчику классов в расширенном виде, и поэтому вы не получаете его в списке результатов.