查找带注释的注释

时间:2013-11-23 11:35:11

标签: java annotations

有一个注释@MarkerAnnotation。它可以直接添加到方法中。或任何其他注释,如

@MarkerAnnotation
@Interface CustomAnnotation {...}

并且此@CustomAnnotation也可以直接添加到方法中。这是许多框架允许用户添加自己的注释(例如spring)的标准方式。

现在,给定一个类,我想找到所有用@MarkerAnnotation直接或间接标记的方法。对于每种方法,我还想查找关联的@MarkerAnnotation和/或@CustomAnnotation。有没有我可以使用的工具,或者我必须手动完成它?

2 个答案:

答案 0 :(得分:0)

对于通用方法,您应该使用javac的注释处理器工具,该工具要求您编写注释处理器,该处理器使用包javax.annotation.processingjavax.lang.model及其中的API。子包。此代码将在javac内运行。 (有一个较旧的工具apt,它与javac分开,但在Java 7中不推荐使用apt。)

特别是,当您访问每个Element时,您可以在其上调用getAnnotationMirrors。然后,对于每个注释,请调用getAnnotationType().asElement()以获取注释类型的Element。如果可能存在多个间接级别,则可能需要使用递归来查找间接注释。

答案 1 :(得分:0)

例如像这样...

public class Test{
         @MarkerAnnotation
         public void TestMethod1(){

         }

         @CustomAnnotation
         @MarkerAnnotation
         public void TestMethod2(){

         }

    }

你可以像这样解析..

public class AnnotationTest{

         public static void main(String[] args){
              Method[] methods = Test.class.getDeclaredMethods();
              for(Method method: methods){
                   Annotation[] annotations = method.getAnnotations();
               for(Annotation annotation: annotations){
                   if(annotation instanceof MarkerAnnotation)
                           System.out.println(method.getName() +" annotated with MarkerAnnotation");
                      if(annotation instanceof CustomAnnotation)
                           System.out.println(method.getName() +" annotated with CustomAnnotation");
                   }
              }
         }
    }

如果你想检查CustomAnnotation有MarkerAnnotation,那么就这样做..

    if(CustomAnnotation.class.isAnnotation()){
        Annotation[] annotations = CustomAnnotation.class.getAnnotations();
        if(annotations[0] instanceof MarkerAnnotation){
            System.out.println("CustomAnnotation have MarkerAnnotation");
        }
    }