24

Javaでプラグインクラスをロードするための素晴らしいツールセットがあることは知っていますが、今日、アイデアが思い浮かびました。

パッケージ"org.home.junk"(アノテーション "@AnnotatedClass"でアノテーションが付けられている)にアノテーション付きクラスとアノテーションなしクラスがたくさんあり、それらのクラスにアノテーション"@AnnotatedMethod"というアノテーション付きメソッドがある場合はどうなりますか。

最初の質問:実行時に、その特定のパッケージ内のすべてのクラスの配列/コレクションを取得して、どのクラスに注釈が付けられているかを確認し、それらのインスタンスを作成できますか?(ただし、Some.classにこのガイドの礼儀で注釈があるかどうかを確認する方法を知っています:http://isagoksu.com/2009/development/java/creating-custom-annotations-and-making-use-of-them/

2番目の質問: -最初の質問でやりたいことができるとしたら-これを行うための最も政治的な方法は何でしょうか?

JUnitが同様の方法でテストケースクラスをロードすることを理解しているので、それは可能だと思います。

また、これが最小限のサードパーティライブラリなどで実行できれば、これもクールです-可能であれば:)

4

4 に答える 4

30

最初の答え:このプロジェクトを見てください。

Reflections reflections = new Reflections("org.home.junk");
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(javax.persistence.Entity.class);

org.home.junk注釈付きの注釈付きからすべてのクラスを返しますjavax.persistence.Entity

2番目の回答:上記のクラスの新しいインスタンスを作成するには、これを行うことができます

for (Class<?> clazz : annotated) {
    final Object newInstance = clazz.newInstance();
}

これがすべてに答えることを願っています。

于 2012-08-18T20:23:05.027 に答える
2

Spring (サード パーティ、申し訳ありません :-)) を使用している場合は、org.springframework.context.annotation.ClassPathScanningCandidateComponentProviderを使用します。

コードの使用例は、この SO の質問にあります。

于 2012-08-18T19:31:37.320 に答える
2

これは、リフレクションの問題というよりもクラスローダーの問題であるため、ファイルシステムをチェックする手法で実行できます。これを確認してください:リフレクションを使用してパッケージ内のすべてのクラスを見つけることができますか? .

ディレクトリに存在するすべてのクラスファイルを確認できれば、このメソッドを使用して対応するクラスを簡単に取得できます

Class<?> klass = Class.forName(className)

クラスに注釈が付けられているかどうかを知ることは、リフレクションの問題です。クラスで使用される注釈を取得するには、次のようにします。

Annotation[] annotations = klass.getAnnotations();

実行時に表示される保持ポリシー タイプを使用してカスタム アノテーションを定義してください。

@Retention(RetentionPolicy.RUNTIME) 

詳細については、http: //tutorials.jenkov.com/java-reflection/annotations.htmlの記事を参照してください。

于 2012-08-18T20:50:14.700 に答える
1

それはすべて、注釈に対する要件の種類によって異なります。

@EJB: このアノテーションは、コンテナーがファイルをスキャンしてそのようなクラスを見つける必要がある EJB 固有の作業を識別して実行できるように設計されています。

ただし、注釈に基づいて特定の機能を有効にすることのみが要件である場合は、Java リフレクションのみを使用して実行できます。

@NotNull: この注釈は、注釈付き要素が null でないことを確認するために JSR 303 で設計されています。この機能は、リフレクション API を使用して実行時に簡単に実装できます。

于 2012-08-18T20:02:00.113 に答える