2017-02-13 52 views
0

我使用java源解析,找到方法簽名與類型齊全

JavaParser類(https://github.com/javaparser/javaparser)和 javasymbolsolver(https://github.com/javaparser/javasymbolsolver)。

解析java源代碼。我期待從.java文件創建一個基本報告來列出方法簽名,如果它們包含完整的Java類型,那將會很好。

所以javaparser的「訪問」演示和javasymbolsolver演示的基本合併,但我跑到了牆上。

上 '的getType' 呼叫吹起來,用

Exception in thread "main" java.lang.UnsupportedOperationException: com.github.javaparser.ast.type.ClassOrInterfaceType 
    at me.tomassetti.symbolsolver.javaparsermodel.JavaParserFacade.getTypeConcrete(JavaParserFacade.java:392) 

這裏是(非工作)的代碼,

static CombinedTypeSolver combinedTypeSolver; 

public static void main(String[] args) throws Exception { 
    combinedTypeSolver = new CombinedTypeSolver(); 
    combinedTypeSolver.add(new JreTypeSolver()); 
    combinedTypeSolver.add(new JarTypeSolver("C:/source.jar")); 
    combinedTypeSolver.add(new JavaParserTypeSolver(new File("C:/src"))); 

    FileInputStream in = new FileInputStream("C:/src/source.java"); 
    CompilationUnit cu = JavaParser.parse(in); 
    new MethodVisitor().visit(cu, null); 
} 

private static class MethodVisitor extends VoidVisitorAdapter<Void> { 
    public void visit(MethodDeclaration n, Void arg) { 

     Node node = n.getType(); 
     System.out.println(node); 
     TypeUsage typeOfTheNode = JavaParserFacade.get(combinedTypeSolver).getType(node); 

     super.visit(n, arg); 
    } 


} 

回答

1

我要推薦添加ReflectionTypeSolverCombinedTypeSolver。 然後,讓所有的M​​ethodDeclaration的名單,我會使用

List<MethodDeclaration> l = Navigator.findAllNodesOfGivenClass(cu, MethodDeclaration.class); 

然後我會包裝每個MethodDeclaration(JavaParser類)的JavaParserMethodDeclaration像

for(MethodDeclaration md : l){ 
    System.out.println(new JavaParserMethodDeclaration(mdec, facade.getTypeSolver()).getQualifiedSignature()); 
}