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源码分析修改框架相关推荐

  1. 【OkHttp】OkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

  2. 【Java源码分析】Java8的HashMap源码分析

    Java8中的HashMap源码分析 源码分析 HashMap的定义 字段属性 构造函数 hash函数 comparableClassFor,compareComparables函数 tableSiz ...

  3. SpringMVC源码分析_框架原理图

                                                                                 SpringMVC源码分析_框架原理图     ...

  4. Activiti源码分析(框架、核心类。。。)

    Activiti源码分析(框架.核心类...) 目录 概 述 activiti源码分析(一)设计模式 总结: 相关工具如下: 分析: 小结: 参考资料和推荐阅读 LD is tigger foreve ...

  5. 【Java源码分析】LinkedHashSet和HashSet源码分析

    类的定义 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, ...

  6. java 源码分析_Java 源代码编译成 Class 文件的过程分析

    原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...

  7. Java源码分析之HashMap(JDK1.8)

    一.HashMap概述 HashMap是常用的Java集合之一,是基于哈希表的Map接口的实现.与HashTable主要区别为不支持同步和允许null作为key和value.由于HashMap不是线程 ...

  8. Scrapy-redis 源码分析 及 框架使用

    From:https://blog.csdn.net/weixin_37947156/article/details/75044971 From:https://cuiqingcai.com/6058 ...

  9. ThinkPHP5.1.x 框架源码分析之框架的灵魂

    一.类的自动加载初始 框架的灵魂,类的自动加载 为什么说是框架灵魂呢,一般框架都会有类的自动加载,当引入文件很多的时候,就会需要用到.这一个也是很多人想去阅读源码时卡住的点 源码阅读 打开到入口文件 ...

  10. 【Java源码分析】Java8的ArrayList源码分析

    Java8的ArrayList源码分析 源码分析 ArrayList类的定义 字段属性 构造函数 trimToSize()函数 Capacity容量相关的函数,比如扩容 List大小和是否为空 con ...

最新文章

  1. Android Bluetooth BLE相关开发资源汇总
  2. Python 第三方库之 Celery 分布式任务队列
  3. CentOS安装SonarQube7.9.1
  4. centos7 安装docker-ce ,最新版本docker,docker阿里云加速
  5. js实现购物车,原理简单,代码解释-->详细
  6. smb协议讲解_SMB协议(使用说明+过程详解+抓包分析)
  7. unity reflect_使用Unity Reflect的不同方法
  8. 线性代数学习笔记——第四十讲——n维向量空间的概念
  9. linux删除序号2的文件,Linux使用rm-rf删除了重要文件?不要慌,我们有恢复神器!-rm文件...
  10. python webpy启动服务
  11. c语言说明函数的作用是,C语言中rewind函数的作用是什么?
  12. MySQL_12_ShardingJDBC实现读写分离与分布式事务
  13. 特斯拉自动驾驶功能更新:将上线红绿灯识别自动停车
  14. 病毒式传播2.0时代的社交游戏开发5要素
  15. PhpStorm修改字体和主题
  16. 使用html5制作聊天室,快速实现H5聊天室和管理功能
  17. python 中exec函数的使用
  18. 健身管理系统 健身房管理系统集成方案
  19. 编译原理学习(到LL1文法部分)
  20. android 读json文件,在Android中读取json文件

热门文章

  1. PowerShell: 如何使用powershell处理Excel
  2. Linux安全加固 附脚本
  3. 酒店管理系统c语言课程设计,基于C语言的酒店管理系统课程设计.doc
  4. UE4GamePlay框架
  5. 磁盘不见了只剩一个c盘_电脑硬盘分区突然见了就剩个C盘到磁盘管理看也只有C盘...
  6. 特征选择算法之ReliefF算法python实现
  7. C语言数据结构之管道浅析
  8. 古代汉语(王力版)笔记 绪论
  9. PIFA和MONOPOLE天线的原理和区别
  10. 加载gif图片html,JS实现的自定义显示加载等待图片插件(loading.gif)