java - 从 Java 源文件中获取类注解

标签 java parsing annotations code-analysis

我正在解析 Java 源文件以收集关于我的类的各种信息。因此我使用 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() + "\"");
                        }
                    }
                }
            }
        }
    }
}

现在如何获取类本身的注释?

最佳答案

您正在覆盖访问方法的 public void visit(MethodDeclaration n, Object arg)。您还可以覆盖 public void visit(ClassOrInterfaceDeclaration n, A arg)public void visit(ClassOrInterfaceType n, A arg),这样您就可以访问您正在访问的信息寻找。

关于java - 从 Java 源文件中获取类注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5410193/

相关文章:

添加了额外的字段上的 Django 注释

java - 使用lucene提取关键词时出错

java - Guice:绑定(bind)具有不同依赖关系的多个对象

java - SVM 响应 opencv 中的问题

c# - 我应该如何用 Double 解析 Infinity?

matlab - 在 Matlab 的 for 循环中为子图创建注释框

spring - @Cachebale 不适用于 Ehcache 和 spring MVC Ehcache 不适用于 Spring 缓存注释

java - 为什么我们不能在java中有抽象构造函数?

java - 如何跨转换跟踪字符串中的原始字符位置?

java - 解析文件中的信息