java - 分析方法内部的变量。 JavaParser/ANTLR 或其他?

标签 java parsing variables reflection antlr

我正在编写一个 Java 代码分析片段,它将找出方法中变量的使用。 (具体是一个全局类变量在一个方法中被读写了多少次)。这可以使用 JavaParser 完成吗?有人会有其他建议吗?有谁知道类指标是如何计算的?他们可能处理类似的事情。

最佳答案

谢谢大家。你的两个答案都引导我使用 JAVAPARSER 中的 AST 实现来解决这个问题。这是帮助他人的代码片段

class CatchNameExpr extends VoidVisitorAdapter {
    HashMap<String, ArrayList<Integer>> variableLineNumMap;``
    ArrayList<String> variableList;
    boolean functionParsing = false;
    public CatchNameExpr(ArrayList<String> classVariables) {
        variableList=classVariables;
    }
    public void visit(MethodDeclaration method, Object arg) {
        System.out.println("---------------");
        System.out.println(method.getName());
        System.out.println("---------------");
        variableLineNumMap = new HashMap<String, ArrayList<Integer>>();
        System.out.println();
        functionParsing = true;
        visit(method.getBody(),arg);
        // Analyze lines for variable usage. Add to list of vars after checking if its read or written or unknown.

        functionParsing = false;
    }

    public void visit(NameExpr n, Object arg) {

        if(!functionParsing)
            return;
        //TODO: check if this var was declared above it, as a local var to the func. if yes, return
        ArrayList<Integer> setOfLineNum;

        System.out.println(n.getBeginLine()+" NameExpr " + n.getName());

        if(!variableList.contains(n.getName()) || n.getName().length()==0)
            return;
        if (!variableLineNumMap.containsKey(n.getName()))
        {
            setOfLineNum =   new ArrayList<Integer>();
            setOfLineNum.add(n.getBeginLine());
            variableLineNumMap.put(n.getName(), setOfLineNum);
        }
        else
        {
            setOfLineNum = variableLineNumMap.get(n.getName());
            setOfLineNum.add(n.getBeginLine());
            variableLineNumMap.put(n.getName(), setOfLineNum);

        }
    }
}

实例化类--->

CatchNameExpr nameExp = new CatchNameExpr(classVariables);
        nameExp.visit(classCompilationUnit, null);

以类似的方式,您可以访问 AST 以获取以下表达式、语句、条件等

http://www.jarvana.com/jarvana/view/com/google/code/javaparser/javaparser/1.0.8/javaparser-1.0.8-javadoc.jar!/japa/parser/ast/visitor/VoidVisitorAdapter.html

我很清楚字节码处理器会更高效,并且会比我希望的更好地完成工作。但考虑到时间限制,这个选项最适合我。

谢谢大家, Jasmine

关于java - 分析方法内部的变量。 JavaParser/ANTLR 或其他?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13558373/

相关文章:

java.lang.IllegalStateException : Connection pool shut down exception from spring-integration-aws library

ruby - 使用 Ruby 进行文件操作

python - 尽管清晰,lxml iterparse 仍会填充内存

excel - 在VBA中通过变量传递给子

java - 从 Java 访问 NexusDB

java - 如果该方法的参数是编译时不在类路径中的类,则通过反射获取声明的方法

java - 如何使用Gson创建多个对象以及如何使用一个JSON文件在Java类中显式引用不同的对象?

java - 如何使用 antlr 在两个终端规则中以不同方式解析特殊字符?

c++ - 将文件内容存储到C++中的变量中

php - 如何在内连接 MYSQL 查询中使用 PHP 变量?