getAnnotation(Class)在处理注释时始终为null

时间:2016-01-20 14:08:18

标签: java annotation-processing

我正在尝试处理注释,我的处理器类扩展AbstractProcessorprocess方法如下:

KeyAnnotationProcessor.java

    @Override
    public boolean process(Set<? extends TypeElement> annotations,
            RoundEnvironment roundEnv) {

        // Instanciation du Visitor
        final KeyVisitor visitor = new KeyVisitor(processingEnv);

        // On boucle sur toutes les Annotations :
        for (final TypeElement  declaration : annotations) {

            // On "visite" chacune des déclarations trouvées :
            declaration.accept(visitor,roundEnv);
        }

   }

正如所提供的代码所示,我正在为每个注释使用访问者,访问者的代码:

KeyVisitor.java

public class KeyVisitor extends SimpleElementVisitor6<Void, RoundEnvironment> {

    final ProcessingEnvironment env;

    public KeyVisitor(final ProcessingEnvironment env) {
        this.env = env;
    }

    @Override
    public Void visitType(TypeElement e, RoundEnvironment p) { 
        Key cle=e.getAnnotation(Key.class);
        if(cle!=null){
            processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE , "OK");
        }else{
            processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR , "ERROR");
        }
    }

这是我的Key class

Key.java

@Documented
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
public @interface Key {
    String description();
    String filename();
}

这是我尝试处理的例子,它是一个java文件:

OracleDirectory.java

@Key(description = "Oracle Directory configuration", filename = "oracle-directory")
public enum OracleDirectoryProperties {

}

问题是cle visitType Keyvisitor中的getAnnotation始终为空,为什么[-0.2122,-0.1213) [-0.2750,-0.2122) [-0.1213,-0.0222) [-0.1213,-0.0222) 方法始终返回null?任何帮助都会被贬低。

2 个答案:

答案 0 :(得分:1)

很确定这是你的问题:

@Retention(RetentionPolicy.SOURCE)

将其更改为

@Retention(RetentionPolicy.CLASS)

SOURCE保留策略告诉Java,“这个注释只需要出现在源代码中” - 因此当javac解析代码时,它会抛出该注释。您希望它在注释处理器中可用,因此需要告诉javac保留类本身的信息。

答案 1 :(得分:0)

传递给X的集合表示要求处理器处理的注释的类型。在您的情况下,它将包含process的{​​{1}}。由于TypeElement没有用@interface Key注释,因此在其上调用Key将返回@Key

要获取以标注 getAnnotation(Key.class)的元素,您需要调用null。这将返回一个包含@Key的{​​{1}}的集合,然后您的访问者将按您期望的方式对其进行处理,并检索其上的roundEnv.getElementsAnnotatedWith(Key.class)批注。