文章目录
- 简介
- 为啥做精准分析
- 效果展示
- Javaparser?ASM?
- [项目: [Javaparser 精准测试项目](https://github.com/abcnull/precise-testing)](#项目: Javaparser 精准测试项目)
简介
javaparser 用于构造 java 抽象语法树 AST,可以依赖 .java 源代码文件进行静态代码分析,通过解析 AST,来找到方法的调用链
这里已经做好 Javaparser 精准测试项目,发布于 github,MIT 协议
此项目使用 java 静态代码分析(底层使用 javaparser 能力),分析 .java 文件,从指定方法入口开始,找到项目中方法的层层调用链路
为啥做精准分析
每次开发迭代,往往有时候会影响历史的某些接口,但无法分析准确的评估具体影响哪些接口,实际生产中往往靠人对业务的理解和记忆,来粗估影响范围,但是这一切不够"精准",因此需要一些工具来做精准分析
[读取源代码文件或字节码文件]
=>
[javaparser,ASM 等工具解析方法调用链找到项目最上层接口]
=>
[使用一些 trace 工具所记录的调用关系,拿到 http 接口]
=>
[通过 http 找到业务场景和用例进行回归测试]
效果展示
可打印出方法调用链路:
Level1#level1_func8(String, int)
├── Level2#Level2()
└── Level2#level2_func8()
├── Level3#Level3()
├── PrintStream#println(String)
└── Level3#level3_func8(boolean)
└── StringUtils#isBlank(null)
Javaparser?ASM?
建议:对于 java 项目,如果只能拿到 .java 文件无法拿到 .class 文件,解析方法调用链可以使用 javaparser 来解析。而若能拿到 .class 字节码文件,那么可以使用 ASM 来解析方法调用链
专门分析 .java 源代码文件的 javaparser 可以解析 AST 出来,但是由于纯 java 代码是静态代码,没有动态信息,纯文本内容很难猜测分析出多态场景,以及目前 lambda 表达式的识别能力有限,并且对于第三方依赖,是不能很好的分析的,除非第三方的依赖的 .java 文件都被下载下来,添加进入符号解析路径中去(但不可能把所有的第三方依赖的源码文件都下载下来)
相比,ASM 专门用来分析 .class 字节码文件,可以分析的更深,但是操作起来难度也更大
【javaparser 和 ASM】
一般企业在做精准测试时,往往会使用 javaparser 结合 ASM 做方法调用链分析。由于 javaparser 做静态代码分析解析的是 .java 文件来构造 AST,而 ASM 则是解析 .class 文件来进行方法调用链分析,其实相比 javaparser 而言,ASM 要解析的更完整一些,且性能更好,但是 ASM 更偏低层能力,用户用起来更麻烦
【不好解析的地方】
相比 ASM,其实 javaparser 很多场景不太好解析:
lambda表达式的场景:javaparser解析的很有限- 多态场景:由于
javaparser做静态代码分析,而多态在运行时确定,所以javaparser无法真正的解析多态场景,可能只能通过 coding 来定一些规则来猜测 - 第三方依赖:项目中往往有很多第三方依赖,如果引入真实的这些依赖的
.java文件的路径,那么这些依赖对应的类也无法解析的完整 - ...
【性能上】
ASM 其实性能要更好,不管是解析速度还是内存占用上
【易用性上】
相比 ASM,javaparser 无疑占优
项目: Javaparser 精准测试项目
功能描述:
此项目使用 java 静态代码分析(底层使用 javaparser 能力),分析 .java 文件,从指定方法入口开始,找到项目中方法的层层调用链路
项目中从入口方法开始往下解析,找到层层方法调用链路,最终构造出 Dag 结构

已经考虑到:
- 方法节点复用
- 循环调用
- 双向遍历
- 多态场景等问题
具体介绍可参照: