2

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 を入手した場合...どんな助けも歓迎します。事前に感謝します。

4

1 に答える 1

0

メソッド呼び出しを解決し、それが標準ライブラリのメソッド部分への呼び出しであるかどうかを確認する必要があるため、パーサーだけを使用して問題を簡単に解決することはできません。

これは、JavaParser を補完するために作成されたライブラリであるJavaSymbolSolverを使用して簡単に実行できます。実際には、次のように呼び出します。

JavaParserFacade.solveMethodAsUsage(myMethodCallExpr)

そして、そのメソッドが定義された型も通知する MethodDeclaration を取得します。タイプを取得したら、パッケージを見て、それがまたはで始まるかどうかを確認して、それjavajavax除外できます。

于 2016-11-13T12:47:52.163 に答える