Ich versuche Reflexionen zu verwenden (wie von org.reflections
bereitgestellt), um einige schwere Lasten zu behandeln, und so muss ich nicht manuell eine Instanz für jede Klasse in einer sehr langen Liste erstellen. Reflections zielt jedoch nicht wie erwartet auf die Klassen ab, was zu Problemen führt.Java-Reflektion mit Child-Klassen
Mein aktueller Reflections Code:
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();
}
}
Im Wesentlichen hat mein Programm alle Befehle in com.example.command.defaults
, wo sie in eine Reihe von Unterpaketen nur für die visuelle Gruppierung unterteilt sind. Jeder Befehl ist in einer eigenen Klasse, in der er eine unserer drei abstrakten Klassen in com.example.command
: PlayerCommand
, SimpleCommand
oder nur Command
erweitert. PlayerCommand
und SimpleCommand
auch erweitern Command
.
Von meinem Verständnis, reflections.getSubTypesOf(Command.class)
sollte mir erlauben, jede Klasse, die Command
in irgendeiner Weise erweitert zielt, aber es scheint nicht auf diese Weise zu arbeiten. Mit meinem Debugger-Tool habe ich festgestellt, dass nur eine einzige Klasse (die nur Command
erweitert) tatsächlich vom System gelesen wird.
Wie kann ich meine Reflections Code Ziel alle Klassen, die Command
und alle Klassen, die eine Klasse erweitern erweitert Command
?
Haben Sie einen Link zum Java-Dokument für diese Bibliothek? – markspace
Da Google scheint zu viel für Sie @ Markspace ... http://static.javadoc.io/org.reflections/reflections/0.9.10/org/reflections/Reflections.html – BlackHatSamurai
Angenommen, dass 'PlayerCommand' und' SimpleCommand' sind im Paket 'com.example.command', Sie sollten' com.example.command' als Paketname anstelle von 'com.example.command.defaults' verwenden. –