2016-11-10 6 views
3

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?

+0

Haben Sie einen Link zum Java-Dokument für diese Bibliothek? – markspace

+0

Da Google scheint zu viel für Sie @ Markspace ... http://static.javadoc.io/org.reflections/reflections/0.9.10/org/reflections/Reflections.html – BlackHatSamurai

+0

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. –

Antwort

0

zu der API-Dokumentation Acording, getSubTypesOf(Class<T> type) erhält alle Untertypen in Hierarchie eines gegebenen Typs, sondern es auch Statistiken, dass dies „on SubTypesScanner hängt konfiguriert“.

Das Problem ist, dass nicht alle Klassen vom Klassenlader geladen und bekannt sind und daher nicht in der Ergebnisliste angezeigt werden.