3

これは私のシナリオです「私は抽象クラスを持っています。注釈を使用してこの抽象クラスを拡張する多くの派生クラスがあります。さらに、1つの特定の派生クラスのすべての表記を反映した抽象クラスのメソッドがあります」。

// Here's a definition of annotation
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SampleAnnotation {
   int sample();
}

public abstract class A { 

 // Here's a method to reflect all annotations
 // in particular derived class like B or C
 @Override
 public void foo() {

 }}

public class B extends A {
  @SampleAnnotation (sample = 1)
  public void step1() {}

  @SampleAnnotation (sample = 2)
  public void step2() {}

}

public class C extends A {
  @SampleAnnotation (sample = 1)
  public void step1() {}

  @Sample (stage = 2)
  public void step2() {}
}

Javaリフレクションを使用して、BやCなどの特定の派生クラスのすべてのアノテーションを反映するにはどうすればよいですか?

4

2 に答える 2

3

おそらく、あなたが念頭に置いているのは、このReflectionsライブラリです。

Reflections を使用すると、次のようなメタデータを照会できます。

  • あるタイプのすべてのサブタイプを取得する
  • 注釈パラメーターが一致しない、何らかの注釈で注釈が付けられたすべての型/メソッド/フィールドを取得します
  • 正規表現に一致するすべてのリソースを取得します
于 2012-08-07T10:12:44.870 に答える
1

場合によります:

  1. 具象クラスのすべてのメソッド注釈を取得しますか?
  2. すべての具象クラスのすべてのメソッド注釈を取得しますか?

foo最初のものは、次のようなメソッド実装で実現できます。

public void foo() {
     for (Method method : this.getClass().getDeclaredMethods()) {
          for (Annotation a : method.getAnnotations()) {
              // do something with a
          }
     }
}

次に、具体的なクラスから呼び出すことができfooます。たとえば、次のようになります。

new B().foo();

2 番目のケースでは、 Peter Lawreyが指摘したように、クラスパス スキャンを実行する必要があります。

于 2012-08-07T10:13:29.777 に答える