Java 如何使用AspectJ在字段上声明警告

Java 如何使用AspectJ在字段上声明警告,java,aop,aspectj,apt,Java,Aop,Aspectj,Apt,我想在AspectJ中用@org.jboss.weld.context.ejb.ejb注释的所有字段上声明一个警告 但是我没有找到一种方法来选择这个字段 我想这方面应该是这样的: public aspect WrongEjbAnnotationWarningAspect { declare warning : within(com.queomedia..*) && ??? (@org.jboss.weld.context.ejb.Ejb)

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

还是根本无法在字段上声明警告?

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

            }
        }
    }
}
public类EmitWarningsForEjbAnnotations实现AnnotationProcessorFactory{
//处理任何一组注释
支持的私有静态最终集合说明
=不可修改的集合(Arrays.asList(“*”);
//没有支持的选项
私有静态最终收集支持选项=清空设置();
公共集合支持的注释类型(){
返回支持的注释;
}
公共收集支持选项(){
返回支持选项;
}
公共注释处理器GetProcessor for(
设置atds,
注释处理(环境环境){
返回新的EjbAnnotationProcessor(env);
}
私有静态类EjbAnnotationProcessor实现AnnotationProcessor{
私人最终注释流程或环境环境;
EjbAnnotationProcessor(AnnotationProcessorEnvironment env){
this.env=env;
}
公共程序(){
for(TypeDeclaration typeDecl:env.getSpecifiedTypeDeclarations())
typeDecl.accept(新的ListClassVisitor());
}
私有静态类ListClassVisitor扩展了SimpleDeclarationVisitor{
公共无效访问类声明(类声明d){
for(FieldDeclaration fd:d.getFields()){
getAnnotation(org.jboss.weld.context.ejb.ejb.class);
}
}
}
}
}

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