2012-03-22 2 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

필자가 볼 수있는 유일한 필드 pointcuts는 get과 set입니다. aspect는 주로 코드 실행에 대한 것이므로 이는 의미가 있습니다. 컴파일러 경고를 선언하는 것은 좋은 부수적 인 이점입니다. 해당 필드의 사용과 독립적 인 필드에 대해서만 이야기하면 포인트 컷은 언제 히트됩니까? AspectJ 대신 Annotation Processing Tool으로 원하는 것을 할 수 있어야한다고 생각합니다. 여기에 첫 번째로 찌르기가 있는데, 주로 위에 링크 된 도구의 웹 페이지에있는 예제에서 복사됩니다.

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 주석 필드를 사용하려고하는 코드에 경고를 표시합니다 필드 자체가 아니라 컴파일 시간 경고로 충분해야합니까?