リフレクション(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
の3つの抽象クラスのいずれかを拡張しています。 PlayerCommand
およびSimpleCommand
もCommand
に拡張されます。
reflections.getSubTypesOf(Command.class)
は、どのような方法でもCommand
を拡張する任意のクラスを対象にすることができますが、そのようには動作していないようです。私のデバッガツールを使用して、ただ1つのクラス(ちょうどCommand
に及ぶ)が実際にシステムによって読み込まれていることに気付きました。
Command
を継承するすべてのクラスと、Command
を継承するクラスを拡張するすべてのクラスをターゲットとしてReflectionsコードを作成するにはどうすればよいですか? APIドキュメントた内容に応じて、
このライブラリの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.defaults'の代わりに 'com.example.command'をパッケージ名として使用してください。 –