微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何知道使用JavaParser读取或修改变量

如何解决如何知道使用JavaParser读取或修改变量

我正在使用JavaParser来解析Java应用程序。我需要一个函数来返回读取或修改方法主体中的变量的次数。例如,该函数应确定以下代码中的变量x被读取两次并被修改一次。

private int foo(){
  int x;
  System.out.println(x); //Read
  x = 10; //modify
  bar(x); //read
}

到目前为止,我已经编写了这段代码

for (ClassOrInterfaceDeclaration cd : cu.findAll(ClassOrInterfaceDeclaration.class)) {
                
    for (MethodDeclaration method : cd.getmethods()) {
                    
        method.getBody().ifPresent(blockStatement -> {
                    
            for( VariableDeclarator variable : blockStatement.findAll(VariableDeclarator.class)) {

                for (NameExpr nameExp : blockStatement.findAll(NameExpr.class)) {
                            
                    if (nameExp.getNameAsstring().equals(variable.getNameAsstring())) {
                        System.out.println(nameExp.getNameAsstring());
                    }
                }
            }
        });
    }
}

使用此代码,我可以知道变量x在方法主体中使用了3次,但我无法区分读写。让我知道使用JavaParser的最佳方法是什么。

解决方法

我可以使用以下代码解决问题:

for (NameExpr nameExpr : callingMethod.findAll(NameExpr.class)) {

    ResolvedValueDeclaration calledVariable = nameExpr.resolve();

    String variableName = calledVariable.getName();
    String variableType = calledVariable.getType().describe();
                
    String type = "Read";

    Node parentNode = nameExpr.getParentNode().get();
    if (parentNode instanceof AssignExpr) {
                    
        Expression target = ((AssignExpr)parentNode).getTarget();
                    
        //Note that arrayAccessExp is not covered in this code
        if (target.isNameExpr()) {
            if (target.asNameExpr().getNameAsString().equals(variableName)) 
                    type = "Write";
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。