2017-06-07 23 views
1

我想,以确定方法,在一个类中,包含一个特定的方法调用来解析Java源文件(.java)。如何解析Java方法的身体吗?

在下面的例子中,我需要知道哪些方法包含一个呼叫到XYZ()。因此,分析器应返回method01和method03

public class A{ 
    private void method01(){ 
     //some statements 
     xyz(); 
     //more statements 
    } 

    private void method02(){ 
     //some statements 
     xyz123(); 
     //more statements 
    } 

    private void method03(){ 
     //some statements 
     xyz(); 
     //more statements 
    } 
} 

我尝试使用JavaParser类(com.github.javaparser)。我创建了一个vistor并通过覆盖

public void visit(MethodDeclaration n, Void arg) 

我能够“访问”班级中的所有方法。

但我不知道如何解析造访的方法的主体。 。我不愿意用n.getBody()的toString()包含(“XYZ()”)

回答

2

通过检查Javadoc,那样子你会做这样的事情:

private MethodDeclaration currentMethod = null; 

@Override 
public void visit(MethodDeclaration n, Void arg) { 
    currentMethod = n; 
    super.visit(n, arg); 
    currentMethod = null; 
} 

@Override 
public void visit(MethodCallExpr n, Void arg) { 
    super.visit(n, arg); 
    if (currentMethod != null && n.getName().asString().equals("xyz") { 
     // Found an invocation of xyz in method this.currentMethod 
    } 
} 

上面的代码跟踪当前的方法,当一个方法调用访问相匹配的名称“XYZ”

+0

有很多方法来解决这个问题,不过这应该工作发现。当然,我们不知道是哪个方法名为XYZ的我们呼吁​​,只是我们是calland的方法名为XYZ的 –