2012-03-22 38 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。這是有道理的,因爲方面主要是關於執行代碼。聲明編譯器警告是一個很好的副作用。如果我們只談論一個領域,而不考慮該領域的使用,那麼切入點何時會被擊中?我認爲你應該可以用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排序的同意,但也覺得get()方法會爲你工作:

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註釋字段的任何代碼顯示警告而不是字段本身,但應該足以作爲編譯時間警告?