如何在类属性上添加注释,并迭代属性?

时间:2012-05-21 03:24:23

标签: java reflection annotations

我想在我的类属性上添加注释,然后迭代我的所有属性,同时也可以查找注释。

例如,我有一个类:

public class User {

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

   // getters and setters
}

现在我希望能够遍历我的属性,并且能够知道属性上的注释(如果有的话)。

我想知道如何使用java进行此操作,但如果使用spring,guava或google guice会使这更容易(如果他们有任何助手可以更容易地做到这一点),那就好奇了。

4 个答案:

答案 0 :(得分:2)

这是一个利用(几乎没有维护的)bean instrospection框架的例子。这是一个全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();
      }
   }
}

答案 1 :(得分: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());
    }
}

答案 2 :(得分:0)

你会使用反射来获取类的字段,然后在每个字段上调用类似getAnnotations()的内容。

答案 3 :(得分:0)

我创建了下面的方法,该方法创建一个类中所有字段的流,并且它是具有特定批注的超类。 还有其他方法可以做到这一点。但是我认为此解决方案非常易于重用且实用,因为当您需要了解这些字段时,通常需要对每个字段进行操作。而Stream正是您要做的。

    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));
    }