有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用AspectJ声明字段上的警告

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

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


共 (2) 个答案

  1. # 1 楼答案

    我看到的唯一字段切入点是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);
                    }
    
                }
            }
        }
    }
    
  2. # 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注释的字段而不是字段本身的代码处显示警告,但作为编译时警告就足够了吗