首页 > 解决方案 > 我的所有自定义注释都有一个通用的基本类型

问题描述

因此,我创建了几个自定义注释:

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

}

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

}

这些注释在我的函数中使用:

public class Worker {

   @Foo
   public void doTaskOne() {...}

   @Bar
   public void doTaskX() {...}

   ...
}

我想使用 java 反射来检查是否在一种方法中声明了某些注释。

for (Method m : methods) {
      if (m.isAnnotationPresent(Foo.class)) {
        ...
      } else if (m.isAnnotationPresent(Bar.class)) {
        ...
      }
}

问题在于,由于在 Java 中,@interface无法扩展自定义注解。我的意思是这是非法的:

public @interface Bar extends MyBaseAnnotation{
}

那是我无法@interface为我的所有自定义注释类FooBar. 所以,如果我创建了一个新的自定义注释,我需要else if在上面的方法检查代码中添加更多条件,这很糟糕!有没有办法摆脱这个问题?我想要实现的是将我的方法检查代码概括为:

for (Method m : methods) {
     if (m.isAnnotationPresent(MyBaseAnnotation.class)) {
         ...
     }
}

如何实现?

标签: javainheritancereflectionannotationsjava-annotations

解决方案


您可以使用基本自定义注释来注释您的自定义注释,就像组合注释一样。

代替:

public @interface Bar extends MyBaseAnnotation{
}

利用:

@MyBaseAnnotation
public @interface Bar {
}

推荐阅读