我想在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!";
}
或者根本无法在字段上声明警告?
答案 0 :(得分:2)
我看到的唯一字段切入点是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);
}
}
}
}
}
答案 1 :(得分: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
注释的字段而不是字段本身的代码中显示警告,但是应该足以作为编译时警告吗?