0

Reflections API を使用して、実行時にカスタム アノテーションが付けられたクラスを見つけるのに非常に苦労しています。最終的な目標は、カスタム @Job アノテーションが付けられたプロジェクト内のすべてのクラスを見つけて収集し、それぞれをページに手動で追加することなく、1 つの場所から実行できるようにすることです。しかし、最初の検索を正しく機能させるのが非常に難しいと感じているため、プロジェクトを進めることができません。

私の現在のアプローチは、次を使用することです。

Reflections reflections = new Reflections(new ConfigurationBuilder()
        .setUrls(ClasspathHelper.forPackage("jobs"))
        .setScanners(new TypeAnnotationsScanner())
        .filterInputsBy(new FilterBuilder().includePackage("jobs")));
Set<Class<?>> jobs = reflections.getTypesAnnotatedWith(Job.class);

ここで、「ジョブ」は、検索しているすべてのジョブ クラスを含むパッケージであり、カスタム @Job アノテーションが付けられます。"jobs" は私のプロジェクトのベース パッケージですが、私のマシンの全体的な URL は ".../(project)/app/jobs" のようになります。この設定により、1 つの URL が検索されます。これは、構成オブジェクトに追加のフィルター「+jobs.*」を含む「.../(project)/app/」です。これは正しく機能しているように見えますが、セットにクラスが含まれていないため、明らかに何かが間違っています。

重要な場合、注釈は次のようにコード化されます。

package jobs;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Job {
    String description();
}

アノテーション クラスは、探しているジョブ クラスと同じ「ジョブ」パッケージ内にあります。アノテーションが含まれているジョブ定義の例は次のとおりです。

package jobs;
@Job(description = "Description of what the job will do")
public class ExampleJob extends MasterJob {...}

この検索を意​​図したとおりに機能させるために変更する必要があるものが見つかりません。助けてくれてありがとう。さらに明確にすることができるかどうか教えてください。

編集: 問題は、Play Framework がそのクラスをロードする方法に関連していると思います。幸いなことに、フレームワークには独自の注釈検索機能が用意されているので、代わりにそれを使用しました。コメントによると、ここにリストしたコードは、実行するためのすべての依存関係がある場合に機能します。それをテンプレートとして自由に使用して、それがあなたにも役立つかどうか教えてください.

4

0 に答える 0