2017-06-07 56 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的 –