Как объявить предупреждение на поле с AspectJ - PullRequest
4 голосов
/ 22 марта 2012

Я хочу объявить предупреждение для всех полей, помеченных @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 ]

2 голосов
/ 05 июля 2012

Единственные поля наблюдения, которые я вижу, предназначены для получения и установки.Это имеет смысл, потому что аспекты в первую очередь касаются выполнения кода.Объявление предупреждений компилятора является хорошим побочным эффектом.Если мы просто поговорим о поле, не зависящем от использования этого поля, когда произойдет попадание в точку?Я думаю, что вы должны иметь возможность делать то, что вы хотите, с помощью инструмента обработки аннотаций вместо 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 голос
/ 05 июля 2012

В некотором роде согласен с @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, а не само поле, но должно быть достаточным для предупреждения времени компиляции?

...