【问题标题】:How to declare a warning on field with AspectJ如何使用 AspectJ 在字段上声明警告
【发布时间】:2012-03-22 11:26:29
【问题描述】:

我想在 AspectJ 中用 @org.jboss.weld.context.ejb.Ejb 注释的所有字段声明警告。

但我没有找到如何选择该字段的方法。

我想方面应该是这样的:

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

或者根本不可能在字段上声明警告?

【问题讨论】:

    标签: java aop aspectj apt


    【解决方案1】:

    我看到的唯一字段切入点是获取和设置。这是有道理的,因为方面主要是关于执行代码。声明编译器警告是一个不错的附带好处。如果我们只讨论一个字段,独立于该字段的使用,什么时候会命中切入点?我认为您应该能够使用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);
                    }
    
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      有点同意@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 注释的字段而不是字段本身的代码处显示警告,但应该足以作为编译时警告吗?

      【讨论】:

        猜你喜欢
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-12
        • 1970-01-01
        相关资源
        最近更新 更多