2011-03-23 9 views
7

Estoy analizando archivos fuente Java para recopilar información sobre mis clases. Por lo tanto, estoy usando el JavaParser, ya que no pude encontrar una buena alternativa (las buenas sugerencias tienen la posibilidad de convertirse en "respuestas") para analizar los archivos fuente.Obtener anotaciones de clase desde el archivo de origen Java

Ya logré obtener Anotaciones de todos los métodos de mi clase. El código se ve así:

package de.mackaz; 

import japa.parser.JavaParser; 
import japa.parser.ParseException; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import japa.parser.ast.CompilationUnit; 
import japa.parser.ast.body.MethodDeclaration; 
import japa.parser.ast.expr.AnnotationExpr; 
import japa.parser.ast.expr.MarkerAnnotationExpr; 
import japa.parser.ast.expr.MemberValuePair; 
import japa.parser.ast.expr.NormalAnnotationExpr; 
import japa.parser.ast.visitor.VoidVisitorAdapter; 
import java.io.FileInputStream; 

public class JavaSourceUtils { 

    public static void main(String[] args) throws Exception { 
     File f = new File("/home/mackaz/SourceFile.java"); 
     inspectJavaFile(f); 
    } 

    public static void inspectJavaFile(File pFile) 
    throws FileNotFoundException, ParseException, IOException { 
     CompilationUnit cu; 
     FileInputStream in = new FileInputStream(pFile); 
     try { 
      cu = JavaParser.parse(in); 
     } finally { 
      in.close(); 
     } 
     new MethodVisitor().visit(cu, null); 
    } 

    /** 
    * Simple visitor implementation for visiting MethodDeclaration nodes. 
    */ 
    private static class MethodVisitor extends VoidVisitorAdapter { 

     @Override 
     public void visit(MethodDeclaration n, Object arg) { 
      System.out.println(n.getName()); 
      if (n.getAnnotations() != null) { 
       for (AnnotationExpr annotation : n.getAnnotations()) { 
        System.out.println(annotation.getClass()); 
        // MarkerAnnotations, for example @Test 
        if (annotation.getClass().equals(MarkerAnnotationExpr.class)) { 
         System.out.println("MarkerAnnotation:" + ((MarkerAnnotationExpr)annotation).getName()); 
        } 
        if (annotation.getClass().equals(NormalAnnotationExpr.class)) { 
         for (MemberValuePair pair : ((NormalAnnotationExpr)annotation).getPairs()) { 
          if (pair.getName().equals("groups")) 
           System.out.println("Group:\"" + pair.getValue() + "\""); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Ahora, ¿cómo puedo obtener las Anotaciones de la clase en sí?

Respuesta

3

está sustituyendo public void visit(MethodDeclaration n, Object arg), que visita métodos También puede anular public void visit(ClassOrInterfaceDeclaration n, A arg) o public void visit(ClassOrInterfaceType n, A arg), lo que debería darle acceso a la información que está buscando.

1

Parece que necesita extender ModifierVisitorAdapter e implementar

public Node visit(ClassOrInterfaceDeclaration n, A arg) {

vistazo a la implementación aquí para obtener una idea de lo que es posible que desee hacer:

public Node visit(ClassOrInterfaceDeclaration n, A arg) { 
     if (n.getJavaDoc() != null) { 
      n.setJavaDoc((JavadocComment) n.getJavaDoc().accept(this, arg)); 
     } 
     List<AnnotationExpr> annotations = n.getAnnotations(); 
     if (annotations != null) { 
      for (int i = 0; i < annotations.size(); i++) { 
       annotations.set(i, (AnnotationExpr) annotations.get(i).accept(this, arg)); 
      } 
      removeNulls(annotations); 
     } 
     List<TypeParameter> typeParameters = n.getTypeParameters(); 
     if (typeParameters != null) { 
      for (int i = 0; i < typeParameters.size(); i++) { 
       typeParameters.set(i, (TypeParameter) typeParameters.get(i).accept(this, arg)); 
      } 
      removeNulls(typeParameters); 
     } 
     List<ClassOrInterfaceType> extendz = n.getExtends(); 
     if (extendz != null) { 
      for (int i = 0; i < extendz.size(); i++) { 
       extendz.set(i, (ClassOrInterfaceType) extendz.get(i).accept(this, arg)); 
      } 
      removeNulls(extendz); 
     } 
     List<ClassOrInterfaceType> implementz = n.getImplements(); 
     if (implementz != null) { 
      for (int i = 0; i < implementz.size(); i++) { 
       implementz.set(i, (ClassOrInterfaceType) implementz.get(i).accept(this, arg)); 
      } 
      removeNulls(implementz); 
     } 
     List<BodyDeclaration> members = n.getMembers(); 
     if (members != null) { 
      for (int i = 0; i < members.size(); i++) { 
       members.set(i, (BodyDeclaration) members.get(i).accept(this, arg)); 
      } 
      removeNulls(members); 
     } 
     return n; 
    } 
2

Esto es cómo lo resolví al final - añadí otro visitante "ClassVisitor":

private static class ClassVisitor extends VoidVisitorAdapter { 
    @Override 
    public void visit(ClassOrInterfaceDeclaration n, Object arg) { 
     for (AnnotationExpr ann: n.getAnnotations()) { 
      System.out.println(ann.toString()); 
     } 
    } 
} 
Cuestiones relacionadas