受到understand的工具的启发,想自己做一个针对java类的代码静态调用工具。
先举个例子:
方法名称:com.person.api.AccountAPI.getPersonLeastInfo(args[1])
call {[
com.house.api.HouseApiTest.test_getConfusedPhoneNumber_normal(args[0])_935,
com.house.service.impl.UserServiceImpl.getUserInfo(args[3])_66,
com.house.api.HouseApiTest.test_getPhoneNumber_normal(args[0])_899
]}
先说下成果,可以通过关键词,计算出xxx类的方法被哪些模块的哪些方法调用例如上图计算出来的,
com.person.api.AccountAPI这个类的getPersonLeastInfo(1个参数的方法),被调用3处,分别在3个不同类的935行(0个参数方法),66行(3个参数方法),899行(0个参数方法)。
作用:可以在研发提交代码后,或者研发修改代码后,自动扫描代码的影响面。往小了说 就是修改一处代码 那里被影响了。
适用于:java类代码跨模块之间调用,如果是单一模块的话 可以直接用eclipse里面的open call hierarchy直接使用。
实现的流程哈:
第1步,首先先确保你的所有要扫描的代码都是最新的代码(这里多说几句,可以更加版本号进行比对,或者做一个类似于jenkins那样的定时触发工具。。好多种做法这个就不一一去说了)
第2步,通过递归的办法,一个一个文件扫描出来所有的*.java类文件,并记录下他们的位置
第3步,通过调用ASTView,一行一行,一个方法一个方法的吧 一个*.java里面的信息存储到一个大的集合中。
1-3步完成后,已经可以知道了很多信息,但是这些信息 仅仅是A方法中调用了哪些B方法
例如
public void A{
B();
}
第4步,这时,我们知道了A都调用了哪些B,但是我们的需求可能是B方法被哪些A调用了。
这时就需要从新变量一般我们第3步的集合, 在遍历的时候,我们可以增加一些简单的过滤逻辑,比如只过滤xxxx模块的,只过滤xxxx名字的。很多种条件,按照自己需要的去实现