2016-01-20 336 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將信息保留在類本身中。