2012-03-22 3 views
4

AspectJで@org.jboss.weld.context.ejb.Ejbと注釈されているすべてのフィールドで警告を宣言したいと思います。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

私が見ている唯一のフィールドポイントカットはgetとsetです。これは、アスペクトは主に実行コードに関するものなので意味があります。コンパイラの警告を宣言することは、優れた副次的利点です。そのフィールドの使用とは無関係に、フィールドについて話しただけで、いつポイントカットがヒットするのですか?私はAspectJの代わりにAnnotation Processing Toolであなたが望むことができるはずだと思います。ここでは最初にそれにスタブがあり、主に上にリンクされているツールのWebページの例からコピーされています。

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で注釈を付けフィールドを使用しようとすると任意のコードで警告が表示されますフィールド自体ではなく、コンパイル時の警告として十分なはずです。

関連する問題