2016-01-20 334 views
0

我试图处理注释,我的处理器类扩展AbstractProcessorprocess方法是这样的:getAnnotation(类)的回报总是空在处理注释

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); 
     } 

    } 

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

KeyVi sitor.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类

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总是空在KeyvisitorvisitType,为什么是getAnnotation方法总是返回null?任何帮助都会有所帮助。

+0

“这是我的关键类”这是你的'OracleDirectoryProperties'类。 –

+0

对不起,我刚刚纠正了我的文章。 – NAIT

+0

你的处理器类是否有'SupportedAnnotationTypes'注释? – wastl

回答

0

很肯定这是你的问题:

@Retention(RetentionPolicy.SOURCE) 

将其更改为

@Retention(RetentionPolicy.CLASS) 

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