2011-03-23 11 views
7

मैं अपनी कक्षाओं के बारे में विभिन्न सूचनाओं को एकत्रित करने के लिए जावा स्रोत फ़ाइलों को पार्स कर रहा हूं। इसलिए मैं JavaParser का उपयोग कर रहा हूं, क्योंकि मुझे स्रोत फ़ाइलों को पार्स करने के लिए एक अच्छा विकल्प नहीं मिला (अच्छे सुझावों को "उत्तर" बनने का मौका मिला है)।जावा स्रोत फ़ाइल से कक्षा एनोटेशन प्राप्त करें

मैं पहले से ही अपनी कक्षा से सभी विधियों की टिप्पणियां प्राप्त करने में कामयाब रहा हूं। कोड इस तरह दिखता है:

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() + "\""); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

अब मैं कक्षा की टिप्पणियां कैसे प्राप्त कर सकता हूं?

उत्तर

3

आप public void visit(MethodDeclaration n, Object arg) अधिभावी कर रहे हैं, जो विज़िट विधियों। आप public void visit(ClassOrInterfaceDeclaration n, A arg) या public void visit(ClassOrInterfaceType n, A arg) को ओवरराइड भी कर सकते हैं, जो आपको उस जानकारी तक पहुंच प्रदान कर सकता है जिसे आप ढूंढ रहे हैं।

1

ऐसा लगता है कि ModifierVisitorAdapter का विस्तार करने और आप क्या करना चाहते हो सकता है की एक विचार के लिए कार्यान्वयन यहाँ पर

public Node visit(ClassOrInterfaceDeclaration n, A arg) {

देखो लागू की जरूरत है:

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

यह वह जगह है मैं यह कैसे अंत में हल - मैं एक और आगंतुक "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()); 
     } 
    } 
} 
संबंधित मुद्दे