javaparser - java源码分析修改框架
生活随笔
收集整理的這篇文章主要介紹了
javaparser - java源码分析修改框架
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
javaparser 包含一組實現具有高級分析功能的 Java 1.0 - Java 15 Parser 的庫。 這包括 Java 13 的預覽功能,Java 14 預覽功能正在進行中。
- Analyse: 編寫可以遍歷 Java 源代碼并查找您感興趣的模式的代碼。
- Transform: 構建的工具不僅可以識別代碼模式,還可以更改它們。
- Generate: 聰明點,不要花時間編寫樣板,生成它!
使用 demo工程: 從官方demo fork的工程里可以看到大部分使用示例(對應于官方指導文檔里使用說明)。
查找指定方法調用所在的行數、函數名、類名
示例代碼:
public static void main(String[] args) throws Exception {CompilationUnit cu = StaticJavaParser.parse(new FileInputStream(FILE_PATH));VoidVisitor<Void> methodCallVisitor = new MethodCallPrinter();methodCallVisitor.visit(cu, null);}private static class MethodCallPrinter extends VoidVisitorAdapter<Void> {@Overridepublic void visit(MethodCallExpr mc, Void arg) {super.visit(mc, arg);Range range = mc.getRange().orElse(Range.range(-1, -1, -1, -1));int startLine = range.begin.line;int endLine = range.end.line;MethodDeclaration methodDeclaration = funcCalledByMethod(mc);ClassOrInterfaceDeclaration classDeclaration = funcCalledByClass(methodDeclaration);System.out.printf("Method call Printed -> method %s called in %s.%s() line [%d, %d]\n",mc.getName().getIdentifier(), classDeclaration == null ? "" : classDeclaration.getName().getIdentifier(),methodDeclaration == null ? "" : methodDeclaration.getName().getIdentifier(), startLine, endLine);}執行結果:
Method call Printed -> method split called in ReversePolishNotation.calc() line [25, 25] Method call Printed -> method pop called in ReversePolishNotation.calc() line [33, 33] Method call Printed -> method pop called in ReversePolishNotation.calc() line [34, 34] Method call Printed -> method push called in ReversePolishNotation.calc() line [35, 35] Method call Printed -> method pop called in ReversePolishNotation.calc() line [38, 38] Method call Printed -> method pop called in ReversePolishNotation.calc() line [39, 39] Method call Printed -> method push called in ReversePolishNotation.calc() line [40, 40] Method call Printed -> method pop called in ReversePolishNotation.calc() line [43, 43] Method call Printed -> method pop called in ReversePolishNotation.calc() line [44, 44] Method call Printed -> method push called in ReversePolishNotation.calc() line [45, 45] Method call Printed -> method pop called in ReversePolishNotation.calc() line [48, 48] Method call Printed -> method pop called in ReversePolishNotation.calc() line [49, 49] Method call Printed -> method push called in ReversePolishNotation.calc() line [50, 50] Method call Printed -> method valueOf called in ReversePolishNotation.calc() line [53, 53] Method call Printed -> method push called in ReversePolishNotation.calc() line [53, 53] Method call Printed -> method of called in ReversePolishNotation.calc() line [28, 28] Method call Printed -> method forEach called in ReversePolishNotation.calc() line [28, 55] Method call Printed -> method pop called in ReversePolishNotation.calc() line [56, 56]查找所在函數的遞歸函數:
/*** 查找節點在哪個函數里調用** @param node 節點* @return 函數聲明*/private MethodDeclaration funcCalledByMethod(@Nullable Node node) {if (node == null) {return null;}Node parentNode = node.getParentNode().get();if (parentNode instanceof MethodDeclaration) {return (MethodDeclaration) parentNode;} else {return funcCalledByMethod(parentNode);}}查找所在類的遞歸函數:
/*** 查找節點在哪個類或接口里** @param node 節點* @return 類或接口聲明*/private ClassOrInterfaceDeclaration funcCalledByClass(@Nullable Node node) {if (node == null) {return null;}Node parentNode = node.getParentNode().get();if (parentNode instanceof ClassOrInterfaceDeclaration) {return (ClassOrInterfaceDeclaration) parentNode;} else {return funcCalledByClass(parentNode);}}參考文獻
http://javaparser.org/
https://github.com/javaparser/javaparser
https://leanpub.com/javaparservisited
https://github.com/BlankLun/javaparser-visited
總結
以上是生活随笔為你收集整理的javaparser - java源码分析修改框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java学习(78):GUL拆分窗口
- 下一篇: java学习(102):arraylis