Я пытаюсь использовать 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
?
У вас есть ссылка на документ Java для этой библиотеки? – markspace
Поскольку Google кажется слишком большим для вас @markspace ... http://static.javadoc.io/org.reflections/reflections/0.9.10/org/reflections/Reflections.html – BlackHatSamurai
Предполагая, что 'PlayerCommand' и' SimpleCommand' находятся в пакете 'com.example.command', вы должны использовать' com.example.command' как имя пакета вместо 'com.example.command.defaults' –