2013-11-23 5 views
0

Существует аннотация @MarkerAnnotation. Он может быть добавлен непосредственно к методу. или любой другой аннотацию, какПоиск аннотированных аннотаций

@MarkerAnnotation 
@Interface CustomAnnotation {...} 

и этот @CustomAnnotation также могут быть добавлены непосредственно к способам. Это стандартный способ, которым многие рамки позволяют пользователям добавлять собственные аннотации (например, весна).

Теперь, учитывая класс, я хочу найти все методы, помеченные прямо или косвенно @MarkerAnnotation. Для каждого метода я также хочу найти связанные @MarkerAnnotation и/или @CustomAnnotation. Есть ли какой-нибудь инструмент, который я могу использовать, или мне нужно сделать это вручную?

ответ

0

Для общего подхода, вы должны использовать аннотацию процессор средство javac, которое требует, чтобы написать процессор аннотаций, которая использует API-интерфейсы в пакетах javax.annotation.processing и javax.lang.model и его подпакетах. Этот код будет работать внутри 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

Весна имеет класс AnnotationUtils в своем основном проекте, который делает то, что вы хотите. Javadoc для findAnnotation:

Найти одну аннотацию annotationType на прилагаемый методе, , пересекающей его супер методы (то есть от суперкласса и интерфейсов) если аннотации непосредственно не присутствуют на самом данном методе. Правильно обрабатывает мост Методы, генерируемые компилятором.

Мета-аннотации будут выполняться, если аннотация не указана непосредственно .

Аннотации по методам не унаследованы по умолчанию, поэтому нам необходимо обрабатывать это явно.

Смежные вопросы