4

我想@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!";
}

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

4

2 回答 2

2

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

            }
        }
    }
}
于 2012-07-05T00:54:56.490 回答
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而不是字段本身的代码上显示警告,但应该足以作为编译时警告吗?

于 2012-07-05T01:35:30.693 回答