0

3 種類のカスタム注釈があります。それらが Annotation1、Annotation2、Annotation3 であるとします。

これら 3 つの注釈をクラスのいくつかのフィールドに適用しました。現在、これら 3 つの注釈が割り当てられているすべてのフィールドを抽出/取得しています。そのために、次のようなメソッドを書きました

public List<Field> getAnnotation1Fields(Annotation1 argAnnotation1){
     // Code to extract those fields...
}

したがって、3 つの注釈に対して、次のような 3 つの異なるメソッドを記述する必要があります。

public List<Field> getAnnotation2Fields(Annotation2 argAnnotation2){
     // Code to extract those fields...
}

public List<Field> getAnnotation3Fields(Annotation3 argAnnotation3){
     // Code to extract those fields...
}

上記のメソッドでは、抽出ロジックは同じですが、パラメーターの型 (引数) が異なります。ここで私の質問は、単一の注釈でこれら 3 つのメソッドを呼び出すにはどうすればよいですか? そのため、任意のタイプの注釈 (カスタム注釈を含む) に対して 1 つの共通メソッドを呼び出すことができます。

4

4 に答える 4

0

それがあなたのニーズに近いことを願っています:

static <A extends Annotation> Map<String,A> getField2Annotation(
  Class<?> declaringClass, Class<A> annotationType) {

  Field[] fields=declaringClass.getDeclaredFields();
  Map<String, A> map=Collections.emptyMap();
  for(Field f:fields) {
    A anno=f.getAnnotation(annotationType);
    if(anno!=null) {
      if(map.isEmpty()) map=new HashMap<String, A>();
      map.put(f.getName(), anno);
    }
  }
  return map;
}

次に、次のようなことができます。

public class Example {
  @Retention(RetentionPolicy.RUNTIME)
  @interface Foo { String value() default "bar"; }

  @Foo static String X;
  @Foo("baz") String Y;

  public static void main(String[] args) {
    Map<String, Foo> map = getField2Annotation(Example.class, Foo.class);
    for(Map.Entry<String,Foo> e:map.entrySet()) {
      System.out.println(e.getKey()+": "+e.getValue().value());
    }
  }
}
于 2013-09-18T11:36:28.417 に答える
0

この簡単な方法でそれを行うことができます:

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

public static List<Field> getAnnotatedFields(Class<?> clazz, Class<? extends Annotation> annotationType) {
    Field[] declaredFields = clazz.getDeclaredFields();
    List<Field> annotatedFields = new LinkedList<>();
    for(Field field : declaredFields) {
        if(field.getAnnotation(annotationType) != null)
            annotatedFields.add(field);
    }
    return annotatedFields;
}

使用例:

getAnnotatedFields(TestClass.class, Deprecated.class);
于 2013-09-18T07:26:10.220 に答える
0

メソッド ジェネリックを使用する - 次のように、クラスだけでなくメソッドにも変数型パラメーターを定義できます。

public <T> List<Field> getAnnotationFields(T argAnnotation) {
  // Get fields with annotation type T
}

そして、次のように簡単に呼び出すことができます。

Annotation3 thingy = ...;
getAnnotationFields(thingy); // Extracts fields for Annotation3
于 2013-09-18T07:15:35.153 に答える