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

Here is an example that utilizes the (barely maintained) bean instrospection framework. It's an all Java solution that you can extend to fit your needs.

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

我创建了下面的方法,它创建了一个类中所有字段的流,它是具有特定注释的超类。还有其他方法可以做到这一点。但是我觉得这个方案很容易复用和实用,因为当你需要知道那些字段的时候,通常是对每个字段做一个动作。而 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));
    }
于 2019-10-18T08:27:58.143 回答
0

您将使用反射来获取类的字段,然后getAnnotations()在每个字段上调用类似的东西。

于 2012-05-21T03:32:52.663 回答