2013-04-25 4 views
2

rfc 메트릭 (클래스에 대한 응답)을 코딩하려고하는데, 메소드 선언 + 메소드 호출을 계산합니다.계산 방법 선언 + 메소드 JavaParser를 사용하여 클래스를 호출합니다.

메서드 선언은 정상적으로 작동하지만 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()), t은 toString()입니다.

더 나은 코드 또는 다른 API를 사용하고 있다면 ... 도움을 환영합니다. 미리 감사드립니다.

답변

0

메서드 호출을 해결하고 표준 라이브러리의 메서드 부분에 대한 호출인지 알아야하기 때문에 파서 만 사용하여 쉽게 문제를 해결할 수 없습니다.

JavaParser를 보완하기 위해 만든 라이브러리 인 JavaSymbolSolver을 사용하면 쉽게 할 수 있습니다. 실제로 당신은 전화 :

JavaParserFacade.solveMethodAsUsage(myMethodCallExpr)

그리고 당신은 다시 해당 메소드가 정의 된 유형을 알려주는 MethodDeclaration를 얻을. 패키지 유형을 확인한 후 패키지를보고 java 또는 javax으로 시작하는지 확인하고 제외하십시오.

+0

모든 종류의 정적 분석 도구를 작성할 때 Life After Parsing이 중요한 이유에 대한 고전적인 예입니다. http://www.semdesigns.com/Products/DMS/LifeAfterParsing.html을 참조하십시오. –