利用JDT-AST解析Java源码的基本能力展示如下所示。
通过JDT-AST可以解析出某个类所有引用的其他类(import)列表、类变量列表、类函数列表、函数内变量列表和函数内逻辑块。有了这些基础信息之后,再遍历每个方法中的每一行,通过正则表达式可以获取此代码行所调用的变量及其方法。比如,针对下面的代码:
对上面的结果稍加处理,可知上述代码分别调用了变量params的put方法和变量remind的getIsAdded方法。基于这个结论,再根据类变量列表及函数内变量列表匹配到对应的类上,即可获得某个类方法调用其他类方法的情况。微服务本身即以类方法(或接口)的形式存在,因此,通过这种方式可以获得微服务之间的调用关系,具体解析过程如图2.12所示。
有了这些信息,就可以逐个遍历方法,扫描方法的每一行代码,通过前面识别出的类变量及方法变量,找出这些变量的对外调用,从而构建出某个类方法对其他类方法的调用关系。如果把源码库中所有微服务工程的源码都进行扫描,可以获得一个Map<string,list></string,list对象集合,Map的key是某个类方法,Value是其调用的其他类方法的集合(为了程序处理方便,可能还需要构建一个类似的被调用关系集合Map)。在此基础上对这个Map进行递归遍历,就可以找出所有这些类方法的调用链路关系,如图2.13所示。图中的F#Func1和K#Func1是微服务的调用入口,一般都作为调用契约以接口的形式存在。在进行代码扫描时,要注意将其与实现类做关联(接口和实现类的关联关系可以通过AST获得。