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源码分析修改框架相关推荐
- 【OkHttp】OkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )
OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...
- 【Java源码分析】Java8的HashMap源码分析
Java8中的HashMap源码分析 源码分析 HashMap的定义 字段属性 构造函数 hash函数 comparableClassFor,compareComparables函数 tableSiz ...
- SpringMVC源码分析_框架原理图
SpringMVC源码分析_框架原理图 ...
- Activiti源码分析(框架、核心类。。。)
Activiti源码分析(框架.核心类...) 目录 概 述 activiti源码分析(一)设计模式 总结: 相关工具如下: 分析: 小结: 参考资料和推荐阅读 LD is tigger foreve ...
- 【Java源码分析】LinkedHashSet和HashSet源码分析
类的定义 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, ...
- java 源码分析_Java 源代码编译成 Class 文件的过程分析
原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...
- Java源码分析之HashMap(JDK1.8)
一.HashMap概述 HashMap是常用的Java集合之一,是基于哈希表的Map接口的实现.与HashTable主要区别为不支持同步和允许null作为key和value.由于HashMap不是线程 ...
- Scrapy-redis 源码分析 及 框架使用
From:https://blog.csdn.net/weixin_37947156/article/details/75044971 From:https://cuiqingcai.com/6058 ...
- ThinkPHP5.1.x 框架源码分析之框架的灵魂
一.类的自动加载初始 框架的灵魂,类的自动加载 为什么说是框架灵魂呢,一般框架都会有类的自动加载,当引入文件很多的时候,就会需要用到.这一个也是很多人想去阅读源码时卡住的点 源码阅读 打开到入口文件 ...
- 【Java源码分析】Java8的ArrayList源码分析
Java8的ArrayList源码分析 源码分析 ArrayList类的定义 字段属性 构造函数 trimToSize()函数 Capacity容量相关的函数,比如扩容 List大小和是否为空 con ...
最新文章
- Android Bluetooth BLE相关开发资源汇总
- Python 第三方库之 Celery 分布式任务队列
- CentOS安装SonarQube7.9.1
- centos7 安装docker-ce ,最新版本docker,docker阿里云加速
- js实现购物车,原理简单,代码解释-->详细
- smb协议讲解_SMB协议(使用说明+过程详解+抓包分析)
- unity reflect_使用Unity Reflect的不同方法
- 线性代数学习笔记——第四十讲——n维向量空间的概念
- linux删除序号2的文件,Linux使用rm-rf删除了重要文件?不要慌,我们有恢复神器!-rm文件...
- python webpy启动服务
- c语言说明函数的作用是,C语言中rewind函数的作用是什么?
- MySQL_12_ShardingJDBC实现读写分离与分布式事务
- 特斯拉自动驾驶功能更新:将上线红绿灯识别自动停车
- 病毒式传播2.0时代的社交游戏开发5要素
- PhpStorm修改字体和主题
- 使用html5制作聊天室,快速实现H5聊天室和管理功能
- python 中exec函数的使用
- 健身管理系统 健身房管理系统集成方案
- 编译原理学习(到LL1文法部分)
- android 读json文件,在Android中读取json文件
热门文章
- PowerShell: 如何使用powershell处理Excel
- Linux安全加固 附脚本
- 酒店管理系统c语言课程设计,基于C语言的酒店管理系统课程设计.doc
- UE4GamePlay框架
- 磁盘不见了只剩一个c盘_电脑硬盘分区突然见了就剩个C盘到磁盘管理看也只有C盘...
- 特征选择算法之ReliefF算法python实现
- C语言数据结构之管道浅析
- 古代汉语(王力版)笔记 绪论
- PIFA和MONOPOLE天线的原理和区别
- 加载gif图片html,JS实现的自定义显示加载等待图片插件(loading.gif)