我有一个注释列表,想要检查我的自定义注释" MyAnnotation"包含在此列表中:
List<java.lang.annotation.Annotation>
我的注释:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
}
什么是最好的检查方法。我是否需要对列表进行交互并比较名称,或者是否有某些方法可以获得&#34; contains()&#34; - 列表的方法在这里工作?
答案 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;
}
}