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를 사용하고 있다면 ... 도움을 환영합니다. 미리 감사드립니다.
모든 종류의 정적 분석 도구를 작성할 때 Life After Parsing이 중요한 이유에 대한 고전적인 예입니다. http://www.semdesigns.com/Products/DMS/LifeAfterParsing.html을 참조하십시오. –