1

クラスのプロパティにアノテーションを追加してから、アノテーションを検索する機能を使用してすべてのプロパティを反復処理したいと思います。

たとえば、次のようなクラスがあります。

public class User {

   @Annotation1
   private int id;
   @Annotation2
   private String name;
   private int age;

   // getters and setters
}

ここで、プロパティをループして、プロパティにどの注釈があるかを知ることができるようにしたいと思います。

Javaだけを使用してこれを行う方法を知りたいのですが、spring、guava、またはgoogle guiceのいずれかを使用すると、これが簡単になるかどうかも知りたいです(これを簡単にするヘルパーがいる場合)。

4

4 に答える 4

2

これは、(ほとんど保守されていない)Beanイントロスペクションフレームワークを利用する例です。これは、ニーズに合わせて拡張できるすべてのJavaソリューションです。

public class BeanProcessor {
   public static void main(String[] args) {
      try {
         final Class<?> beanClazz = BBean.class;
         BeanInfo info = Introspector.getBeanInfo(beanClazz);
         PropertyDescriptor[] propertyInfo = info.getPropertyDescriptors();
         for (final PropertyDescriptor descriptor : propertyInfo) {
            try {
               final Field field = beanClazz.getDeclaredField(descriptor
                     .getName());
               System.out.println(field);
               for (final Annotation annotation : field
                     .getDeclaredAnnotations()) {
                  System.out.println("Annotation: " + annotation);
               }

            } catch (final NoSuchFieldException nsfe) {
               // ignore these
            }
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}
于 2012-05-21T03:54:18.220 に答える
2

以下は、独自の注釈を作成する方法です

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)

public @interface Annotation1 {
    public String name();
    public String value();
}

アノテーションを定義したら、質問で述べたようにアノテーションを使用します。以下のリフレクションメソッドを使用して、アノテーション付きのクラスの詳細を取得できます。

Class aClass = User.class;
Annotation[] annotations = aClass.getAnnotations();

for(Annotation annotation : annotations){
    if(annotation instanceof Annotation1){
        Annotation1 myAnnotation = (Annotation1) annotation;
        System.out.println("name: " + myAnnotation.name());
        System.out.println("value: " + myAnnotation.value());
    }
}
于 2012-05-21T04:22:01.627 に答える
1

以下のメソッドを作成しました。このメソッドは、クラス内のすべてのフィールドのストリームを作成し、特定のアノテーションを持つスーパークラスです。それを行うには他の方法があります。しかし、これらのフィールドを知る必要がある場合、通常は各フィールドでアクションを実行するため、このソリューションは再利用が非常に簡単で実用的だと思います。そして、ストリームはまさにあなたがそれをするために必要なものです。

    public static Stream<Field> getAnnotatedFieldStream(Class<?> theClass, Class<? extends Annotation> annotationType) {
      Class<?> classOrSuperClass = theClass;
      Stream<Field> stream = Stream.empty();
      while(classOrSuperClass != Object.class) {
        stream = Stream.concat(stream, Stream.of(classOrSuperClass.getDeclaredFields()));
        classOrSuperClass = classOrSuperClass.getSuperclass();
      }
      return stream.filter(f -> f.isAnnotationPresent(annotationType));
    }
于 2019-10-18T08:27:58.143 に答える
0

リフレクションを使用してクラスのフィールドを取得してから、各フィールドのようなものを呼び出しgetAnnotations()ます。

于 2012-05-21T03:32:52.663 に答える