使用ASTView分析代码调用关系分析的具体应用

来源:互联网 发布:js动态添加a标签 编辑:程序博客网 时间:2024/04/30 09:08

受到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名字的。很多种条件,按照自己需要的去实现


1 0