【问题标题】:Counting Methods declaration + Methods Calls in a class using JavaParser使用 JavaParser 在类中计算方法声明 + 方法调用
【发布时间】:2013-04-25 12:27:34
【问题描述】:

我正在尝试编写 rfc 指标(类的响应),它计算方法声明 + 方法调用。

方法声明工作正常,但我在使用 JavaParser API 计算方法调用时遇到了问题。

这是我的代码:

public class MethodPrinter {

    public static void main(String[] args) throws Exception {
        // creates an input stream for the file to be parsed
        FileInputStream in = new FileInputStream("D://test.java");
        CompilationUnit cu;
        try {
            // parse the file
            cu = JavaParser.parse(in);
        } finally {
            in.close();
        }
        // visit and print the methods names
        MethodVisitor MV =new MethodVisitor();

        cu.accept(new VoidVisitorAdapter<Void>(){
            @Override
            public void visit(final MethodCallExpr n, final Void arg){
                System.out.println("method call :"+n);
                super.visit(n, arg);

            }
        }, null);
    }
}

test.java

package test;
import java.util.*;

public class ClassA 
{
  private int test;
  private ClassB classB = new ClassB();
  public void doSomething(int t){

    System.out.println ( toString());
    int i= doSomethingBasedOnClassBBV(classB.toString());
  }
  protected void doSomethingBasedOnClassB(){
    System.out.println (classB.toString());
  }
}

public class ClassB 
{
  private ClassA classA = new ClassA();
  public void doSomethingBasedOneClassA(){
    System.out.println (classA.toString());
  }

  private String toString(){
    return "classB";
  }
  private String toString(){
    return "classB";
  }
  public void doSomethingBasedOneClassA(){
    System.out.println (classA.toString());
  }
  protected void doSomethingBasedOnClassB(){
    System.out.println (classB.toString());
  }
}

该代码的结果:

*method call :System.out.println(toString())

method call :toString()

method call :doSomethingBasedOnClassBBV(classB.toString())

method call :classB.toString()

method call :System.out.println(classB.toString())

method call :classB.toString()

method call :System.out.println(classA.toString())

method call :classA.toString()

method call :System.out.println(classA.toString())

method call :classA.toString()

method call :System.out.println(classB.toString())

method call :classB.toString()*

确实,该代码检查方法调用,但在我的情况下,我不希望它计算像 System.out.println(toString()) 这样的库方法调用,我希望它只计算 toString()

如果您有更好的代码或其他 API 可以使用...欢迎任何帮助,提前谢谢您。

【问题讨论】:

    标签: java parsing methods javaparser


    【解决方案1】:

    仅使用解析器无法轻松解决问题,因为您需要解析方法调用并确定它是否是对标准库中方法部分的调用。

    您可以使用JavaSymbolSolver 轻松做到这一点,这是一个为补充JavaParser 而创建的库。在实践中,您调用:

    JavaParserFacade.solveMethodAsUsage(myMethodCallExpr)

    然后您会返回一个 MethodDeclaration,它还告诉您定义该方法的类型。获得类型后,您可以查看包并检查它是否以 javajavax 开头并将其排除。

    【讨论】:

    猜你喜欢
    • 2018-12-03
    • 1970-01-01
    • 2015-07-10
    • 2013-11-09
    • 2022-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多