2013-05-10 73 views
1

我有一個註釋處理器和我需要得到與元素相關聯的類,所以我可以檢索其聲明的字段:越來越聲明annotatted類的字段註釋處理器

@Override 
public boolean process(Set<? extends TypeElement> annotations, 
     RoundEnvironment roundEnv) { 
    String className = null; 
    String packageName = null; 
    String fqClassName = null; 
    List<String> fields = new LinkedList<String>(); 
    for (Element elem : roundEnv.getElementsAnnotatedWith(FieldConstant.class)) { 
     if (elem.getKind() == ElementKind.CLASS) { 
      //    Encrypt encrypt = elem.getAnnotation(Encrypt.class); 
      //    String message = "annotation found in " + elem.getSimpleName(); 
      //    processingEnv.getMessager().printMessage(Kind.NOTE, message); 
      TypeElement classElement = (TypeElement) elem; 
      PackageElement packageElement = (PackageElement) classElement.getEnclosingElement(); 
      className = classElement.getSimpleName().toString(); 
      for(Field field : classElement.getClass().getDeclaredFields()){ 
       do something... 
      } 
     ..... 

顯然,className.getClass()返回TypeElement.class但我想檢索帶註釋的類。我怎樣才能做到這一點?

+0

這不是很清楚你正在嘗試做的。你有一個類的列表,並試圖找到哪個類註解了註釋? – nakosspy 2013-05-10 18:21:04

回答

7

對於正在編譯的代碼,您不能使用反射,因爲代碼可能已在之前的傳遞中被修改或生成(您將如何將它們添加到類路徑???)。

不過好消息是,您可以使用javax.lang.model中的軟件包來獲取字段的屬性。

下面的例子打印所有字段定義到System.out(或許缺少一些關鍵字,如transient):

@Override 
public boolean process(Set<? extends TypeElement> annotations, 
     RoundEnvironment roundEnv) { 
    for (Element elem : roundEnv.getElementsAnnotatedWith(FieldConstant.class)) { 
     if (elem.getKind() == ElementKind.CLASS) { 
      // print fields 
      for (Element enclosedElement : elem.getEnclosedElements()) { 
       if (enclosedElement.getKind() == ElementKind.FIELD) { 
        Set<Modifier> modifiers = enclosedElement.getModifiers(); 
        StringBuilder sb = new StringBuilder(); 
        if (modifiers.contains(Modifier.PRIVATE)) { 
         sb.append("private "); 
        } else if (modifiers.contains(Modifier.PROTECTED)) { 
         sb.append("protected "); 
        } else if (modifiers.contains(Modifier.PUBLIC)) { 
         sb.append("public "); 
        } 
        if (modifiers.contains(Modifier.STATIC)) 
         sb.append("static "); 
        if (modifiers.contains(Modifier.FINAL)) 
         sb.append("final "); 
        sb.append(enclosedElement.asType()).append(" ").append(enclosedElement.getSimpleName()); 
        System.out.println(sb); 
       } 
      } 
     } 
    } 
    ...