有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何检查AnnotationInvocationHandler与Annotation的关系

我有一个注释定义为

@Retention(RUNTIME)
@Target(FIELD)
@interface A {}

使用此注释的类

class C {
  @A String f;
}

然而,在运行时,它被一个带有AnnotationInvocationHandlerProxy包装,例如Field f = C.class.getField("f"); f.getDeclaredAnnotations()返回这个Proxy的数组。在这种情况下,如何检查类C的字段f是否用注释A进行了注释

注意:f.isAnnotationPresent(A.class)返回false


共 (1) 个答案

  1. # 1 楼答案

    f.isAnnotationPresent(A.class) returns false

    这是因为注释A没有runtime retention,所以在运行时删除注释(默认的运行时保留期为^{}

    尝试在以下位置修改注释:

    @Retention(RetentionPolicy.RUNTIME)
    @interface A {
    }
    

    然后f.isAnnotationPresent(A.class)将返回true

    注意:在某些IDE中,如果注释没有运行时保留,则调用isAnnotationPresent时会出现警告。 例如,在Netbeans 8.1中,您可以看到一条消息com.mypackage.A does not have runtime Retention, the result will always be false