2012-03-22 2 views
4

Я хочу объявить предупреждение обо всех полях Аннотированный @org.jboss.weld.context.ejb.Ejb в AspectJ.Как объявить предупреждение в поле с AspectJ

Но я не могу найти способ выбора этого поля.

Я предполагаю, что аспект должен быть чем-то вроде этого:

public aspect WrongEjbAnnotationWarningAspect { 
    declare warning : 
     within(com.queomedia..*) && 
     ??? (@org.jboss.weld.context.ejb.Ejb) 
     : "WrongEjbAnnotationErrorAspect: use javax.ejb.EJB instead of weld Ejb!"; 
} 

Или это невозможно объявить предупреждения на полях вообще?

ответ

2

Единственные полевые точки, которые я вижу для получения и установки. Это имеет смысл, поскольку аспекты в основном касаются выполнения кода. Объявление предупреждений компилятора - это отличное преимущество. Если мы просто поговорим о поле, независимо от использования этого поля, когда будет удалено pointcut? Я думаю, что вы должны сделать то, что хотите, с помощью Annotation Processing Tool вместо AspectJ. Вот первый удар по нему, в основном скопированный из примера на веб-странице инструмента, приведенной выше.

public class EmitWarningsForEjbAnnotations implements AnnotationProcessorFactory { 
    // Process any set of annotations 
    private static final Collection<String> supportedAnnotations 
     = unmodifiableCollection(Arrays.asList("*")); 

    // No supported options 
    private static final Collection<String> supportedOptions = emptySet(); 

    public Collection<String> supportedAnnotationTypes() { 
     return supportedAnnotations; 
    } 

    public Collection<String> supportedOptions() { 
     return supportedOptions; 
    } 

    public AnnotationProcessor getProcessorFor(
      Set<AnnotationTypeDeclaration> atds, 
      AnnotationProcessorEnvironment env) { 
     return new EjbAnnotationProcessor(env); 
    } 

    private static class EjbAnnotationProcessor implements AnnotationProcessor { 
     private final AnnotationProcessorEnvironment env; 

     EjbAnnotationProcessor(AnnotationProcessorEnvironment env) { 
      this.env = env; 
     } 

     public void process() { 
      for (TypeDeclaration typeDecl : env.getSpecifiedTypeDeclarations()) 
       typeDecl.accept(new ListClassVisitor()); 
     } 

     private static class ListClassVisitor extends SimpleDeclarationVisitor { 
      public void visitClassDeclaration(ClassDeclaration d) { 
       for (FieldDeclaration fd : d.getFields()) { 
        fd.getAnnotation(org.jboss.weld.context.ejb.Ejb.class); 
       } 

      } 
     } 
    } 
} 
1

Сорта согласен с @JohnWatts, но и чувствовать, что получить() будет работать для вас:

declare warning : 
    within(com.queomedia..*) && 
    get(@org.jboss.weld.context.ejb.Ejb * *.*) 
    : "WrongEjbAnnotationErrorAspect: use javax.ejb.EJB instead of weld Ejb!"; 

Это покажет предупреждение в любом коде, который пытается использовать поля аннотированных с @org.jboss.weld.context.ejb.Ejb а не само поле, но должно быть достаточным для предупреждения времени компиляции?