检查注释列表中是否包含注释

时间:2014-05-12 15:00:15

标签: java collections annotations

我有一个注释列表,想要检查我的自定义注释" MyAnnotation"包含在此列表中:

List<java.lang.annotation.Annotation>

我的注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) 
public @interface MyAnnotation {

}

什么是最好的检查方法。我是否需要对列表进行交互并比较名称,或者是否有某些方法可以获得&#34; contains()&#34; - 列表的方法在这里工作?

2 个答案:

答案 0 :(得分:2)

如果我的问题正确无误,那么根据Annotation.equals(java.lang.Object)上的文档,您应该能够使用列表中的contains()方法。

  

如果指定的对象表示逻辑上等于此注释的注释,则返回true。换句话说,如果指定的对象是与此实例相同的注释类型的实例,则返回true,其所有成员都等于此注释的相应成员,如下所示:

     
      
  • 如果x == y,则值为x和y的两个对应的原始类型成员被认为是相等的,除非它们的类型是float或double。
  •   
  • 如果Float.valueOf(x).equals(Float.valueOf(y)),则值为x和y的两个相应的float成员被认为是相等的。 (与==运算符不同,NaN被认为与自身相等,并且0.0f不等于-0.0f。)
  •   
  • 如果Double.valueOf(x).equals(Double.valueOf(y)),则值为x和y的两个对应的double成员被认为是相等的。 (与==运算符不同,NaN被认为与自身相等,0.0不等于-0.0。)
  •   
  • 如果x.equals(y),则值为x和y的两个对应的String,Class,enum或annotation类型成员被视为相等。 (请注意,此定义对于注释类型成员是递归的。)
  •   
  • 如果Arrays.equals(x,y)适当重载Arrays.equals(long [],long []),则认为两个相应的数组类型成员x和y相等。
  •   

以下演示片段和它的输出似乎证明了它 -

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) 
@interface MyAnnotation {
    String value();
}

public class Main {
    @MyAnnotation(value = "onM1") public static void m1() { }
    @MyAnnotation(value = "onM1") public static void m() { }
    @MyAnnotation(value = "onM2") public static void m2() { }
    @MyAnnotation(value = "onM3") public static void m3() { }


    public static void main(String[] args) throws Exception {
        Method m = Main.class.getMethod("m1", new Class<?>[] {});
        Annotation onM1 = m.getAnnotation(MyAnnotation.class);

        m = Main.class.getMethod("m2", new Class<?>[] {});
        Annotation onM2 = m.getAnnotation(MyAnnotation.class);

        m = Main.class.getMethod("m3", new Class<?>[] {});
        Annotation onM3 = m.getAnnotation(MyAnnotation.class);

        m = Main.class.getMethod("m", new Class<?>[] {});
        Annotation onM = m.getAnnotation(MyAnnotation.class);

        List<Annotation> annots = Arrays.asList(onM1, onM2);

        System.out.println(annots);
        System.out.println(annots.contains(onM3));
        System.out.println(annots.contains(onM1));
        System.out.println(annots.contains(onM2));
        System.out.println(annots.contains(onM));
    }
}

<强>输出

false
true
true
true

答案 1 :(得分:0)

boolean containsMyAnnotation = false;
// For each annotation in the list...
for(Annotation annotation : myListOfAnnotations) {
    // If they are MyAnnotation
    if(annotation.class == MyAnnotation.class) {
        // Then it exists in the list
        containsMyAnnotation = true; 
        // Break the for loop
        break;
    }
}