2013-11-23 140 views
0

有註釋@MarkerAnnotation。它可以直接添加到方法中。或以任何其他註釋,像查找帶註釋的註釋

@MarkerAnnotation 
@Interface CustomAnnotation {...} 

並且這@CustomAnnotation也可以直接加入到方法。這是許多框架允許用戶添加自己的註釋(例如spring)的標準方式。

現在,給定一個班級,我想找到所有直接或間接使用@MarkerAnnotation標記的方法。對於每種方法,我也想找到關聯的@MarkerAnnotation和/或@CustomAnnotation。有沒有我可以使用的工具,或者我必須手動執行它?

回答

0

對於一個通用的方法,你應該使用的javac標註處理設施,這需要你寫它使用在包裝javax.annotation.processing,並javax.lang.model及其子包API的註釋處理器。此代碼將在javac內運行。 (有一個較舊的工具,apt,這是從javac分開,但apt在Java 7中不建議使用)

特別是,當您訪問的每個Element,你可以調用它getAnnotationMirrors。然後,對於每個註釋,請致電getAnnotationType().asElement()以獲取批註類型的Element。如果可能存在多個間接註釋級別,則可能需要使用遞歸來查找間接註釋。

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"); 
     } 
    } 
2

Spring在他們的核心項目中有一個AnnotationUtils類,它可以做你想做的。爲findAnnotation的Javadoc:

查找annotationType的所提供的方法, 單個註釋遍歷其超方法(即,從超和接口) 如果註釋不直接存在於給定方法本身。 正確處理編譯器生成的方法。

如果註釋不是直接在方法上存在 ,將會搜索元註釋。

默認情況下,方法的註釋不會被繼承,所以我們需要 明確地處理它。