一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

代码服务调用关系生成方法、装置和计算机设备与流程

2023-03-09 15:22:11 来源:中国专利 TAG:


1.本技术涉及云计算技术领域,特别是涉及一种代码服务调用关系生成方法、装置、计算机设备、存储介质和计算机程序产品。


背景技术:

2.随着分布式技术的发展,目前的计算机程序系统由传统的单体架构逐步演变为众多微服务构成的分布式架构。分布式架构带来了按需扩展、灵活部署、可用性高等优点,但分布式系统中服务间复杂的调用关系也导致架构设计和开发调试的难度增加。因此需要对程序代码中的服务间的调用关系进行整理,目前确定服务间调用关系的方式通常是通过服务注册中心获取在其中注册和订阅的服务间的调用关系。然而,通过服务注册中心获取服务间调用关系,由于服务注册中心中的服务需要代码运行后才能生成,当发现调用关系问题时,对代码维护的难度较大。
3.因此,目前的代码服务调用关系生成方法存在可维护性低的缺陷。


技术实现要素:

4.基于此,有必要针对上述技术问题,提供一种能够提高代码服务可维护性的代码服务调用关系生成方法、装置、计算机设备、计算机可读存储介质和计算机程序产品。
5.第一方面,本技术提供了一种代码服务调用关系生成方法,所述方法包括:
6.获取待检测源代码,对所述待检测源代码进行语法解析,得到对应的语法解析树;所述语法解析树中包括与所述待检测源代码的多个代码模块对应的多个节点,节点之间的关系基于所述多个代码模块之间的对应关系确定;
7.遍历所述语法解析树,获取所述语法解析树中方法声明代码模块与其对应的子节点中至少一个方法调用代码模块的第一关系、方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系以及各代码模块所属的服务方;所述服务方包括服务提供方和服务消费方;所述代码模块包括方法声明代码模块和方法调用代码模块;
8.根据所述第一关系和所述第二关系,确定所述待检测源代码中代码模块间的调用关系表,并根据所述代码模块所属的服务方,向所述调用关系表中的代码模块添加对应的服务方标识,得到所述待检测源代码对应的代码服务调用关系表。
9.在其中一个实施例中,所述获取待检测源代码,对所述待检测源代码进行语法解析,得到对应的语法解析树,包括:
10.检测所述待检测源码中的声明代码模块;所述声明代码模块包括属性声明代码模块和类声明代码模块;
11.检测所述属性声明代码模块中的属性信息代码模块,并检测所述类声明代码模块中的类信息代码模块、方法声明代码模块和所述方法声明代码模块对应的方法调用代码模块;
12.将所述待检测源代码所在的工程作为根节点,将所述属性声明代码模块、属性信息代码模块和所述类声明代码模块作为父节点,将所述类信息代码模块和方法声明代码模块作为所述类声明代码模块的子节点,将所述方法调用代码模块作为所述方法声明代码模块的子节点,得到所述待检测代码对应的语法解析树。
13.在其中一个实施例中,所述遍历所述语法解析树,获取所述语法解析树中方法声明代码模块与其对应的子节点中至少一个方法调用代码模块的第一关系、方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系以及各代码模块所属的服务方,包括:
14.遍历所述语法解析树,根据所述语法解析树中方法声明代码模块及其对应的子节点中的方法调用代码模块,确定所述方法声明代码模块与其对应的子节点中至少一个方法调用代码模块的第一关系;
15.根据所述语法解析树中每个类声明代码模块对应的子节点中的方法声明代码模块,以及每个类声明代码模块对应的父类声明代码模块和子类声明代码模块中的方法声明代码模块,确定所述方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系;
16.根据所述语法解析树中的类声明代码模块和属性声明代码模块,确定所述类声明代码模块中的方法声明代码模块和/或方法调用代码模块所属的服务方。
17.在其中一个实施例中,所述根据所述语法解析树中方法声明代码模块及其对应的子节点中的方法调用代码模块,确定所述方法声明代码模块与其对应的子节点中至少一个方法调用代码模块的第一关系,包括:
18.获取所述语法解析树中的方法声明代码模块,并检测所述方法声明代码模块包含的子树,获取所述子树中的方法调用代码模块;
19.建立所述方法声明代码模块与所述子树中的方法调用代码模块的第一关系。
20.在其中一个实施例中,所述根据所述语法解析树中每个类声明代码模块对应的子节点中的方法声明代码模块,以及每个类声明代码模块对应的父类声明代码模块和子类声明代码模块中的方法声明代码模块,确定所述方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系,包括:
21.获取所述语法解析树中每个类声明代码模块的子树中的方法声明代码模块,若检测到所述子树中的方法声明代码模块中存在方法实现代码,则建立所述子树中的方法声明代码模块对应的方法调用代码模块与所述子树中的方法声明代码模块的当前类第二关系;
22.确定所述每个类声明代码模块的父子关系,并获取所述语法解析树中每个类声明代码模块对应的父类声明代码模块和子类声明代码模块;
23.针对每个类声明代码模块,若检测到该类声明代码模块对应的父类声明代码模块中,存在包含方法实现代码的父方法声明代码模块,则建立该类声明代码模块对应的第一目标方法调用代码模块与所述父方法声明代码模块的父类第二关系;所述第一目标方法调用代码模块的方法名称与所述父方法声明代码模块的方法名称相同;
24.若检测到该类声明代码模块对应的子类声明代码模块中,存在包含方法实现代码的子方法声明代码模块,则建立所述该类声明代码模块对应的第二目标方法调用代码模块与所述子方法声明代码模块的子类第二关系;所述第二目标方法调用代码模块的方法名称
与所述子方法声明代码模块的方法名称相同;
25.根据所述当前类第二关系、所述父类第二关系和所述子类第二关系,得到所述方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系。
26.在其中一个实施例中,所述根据所述语法解析树中的类声明代码模块和属性声明代码模块,确定所述类声明代码模块中的方法声明代码模块和/或方法调用代码模块所属的服务方,包括:
27.获取所述语法解析树中类声明代码模块的子节点中的类信息代码模块;
28.若所述类信息代码模块对应的类信息为服务提供方,确定所述类声明代码模块对应的方法声明代码模块属于服务提供方;
29.和/或,
30.获取所述语法解析树中属性声明代码模块对应的属性信息代码模块;
31.若所述属性信息代码模块对应的属性信息包含服务消费方,且所述语法解析树中的方法调用代码模块的调用主体为所述属性信息,确定所述方法调用代码模块属于服务消费方。
32.在其中一个实施例中,所述根据所述第一关系和所述第二关系,确定所述待检测源代码中代码模块间的调用关系表,包括:
33.根据所述第一关系,确定所述方法声明代码模块与方法调用代码模块的第一关联关系;
34.根据所述第二关系,确定所述方法调用代码模块与方法声明代码模块的第二关联关系;
35.若所述第二关联关系中方法调用代码模块对应的方法声明代码模块存在于所述第一关联关系中,建立所述第一关联关系中所述方法调用代码模块对应的方法声明代码模块与所述第二关联关系中所述方法调用代码模块对应的方法声明代码模块的第三关联关系;
36.根据所述第一关联关系、第二关联关系和所述第三关联关系,确定代码模块间的调用关系表。
37.在其中一个实施例中,所述根据所述代码模块所属的服务方,向所述调用关系表中的代码模块添加对应的服务方标识,得到所述待检测源代码对应的代码服务调用关系表,包括:
38.针对所述调用关系表中的每个方法声明代码模块,若该方法声明代码模块属于服务提供方,且该方法声明代码模块在所述调用关系表中不存在父关联关系,向该方法声明代码模块添加服务提供方标识;
39.针对所述调用关系表中的每个方法调用代码模块,若该方法调用代码模块属于服务消费方,且该方法调用代码模块在所述调用关系表中不存在子关联关系,向该方法调用代码模块添加服务消费方标识;
40.根据添加服务提供方标识和服务消费方标识后的调用关系表,得到代码服务调用关系表。
41.在其中一个实施例中,所述得到所述待检测源代码对应的代码服务调用关系表之
后,还包括:
42.接收代码服务调用关系查询信息,获取所述代码服务调用关系查询信息中的工程标识、类标识和方法标识;
43.根据所述工程标识查询对应的工程,根据所述类标识在所述工程中查询对应的类名称,并根据所述方法标识在所述类名称对应的类中查询对应的方法名称;
44.获取包含所述方法名称的代码服务调用关系表,作为查询结果。
45.第二方面,本技术提供了一种代码服务调用关系生成装置,所述装置包括:
46.获取模块,用于获取待检测源代码,对所述待检测源代码进行语法解析,得到对应的语法解析树;所述语法解析树中包括与所述待检测源代码的多个代码模块对应的多个节点,节点之间的关系基于所述多个代码模块之间的对应关系确定;
47.遍历模块,用于遍历所述语法解析树,获取所述语法解析树中方法声明代码模块与其对应的子节点中至少一个方法调用代码模块的第一关系、方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系以及各代码模块所属的服务方;所述服务方包括服务提供方和服务消费方;所述代码模块包括方法声明代码模块和方法调用代码模块;
48.生成模块,用于根据所述第一关系和所述第二关系,确定所述待检测源代码中代码模块间的调用关系表,并根据所述代码模块所属的服务方,向所述调用关系表中的代码模块添加对应的服务方标识,得到所述待检测源代码对应的代码服务调用关系表。
49.第三方面,本技术提供了一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现上述的方法的步骤。
50.第四方面,本技术提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述的方法的步骤。
51.第五方面,本技术提供了一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现上述的方法的步骤。
52.上述代码服务调用关系生成方法、装置、计算机设备、存储介质和计算机程序产品,通过遍历待检测源代码对应的语法解析树,获取语法解析树中方法声明代码模块与其子节点中至少一个方法调用代码模块的第一关系、方法调用模块与其所在的类和对应的父类中的至少一个方法声明代码模块的第二关系以及各代码模块所属的服务方,并根据第一关系和第二关系,确定待检测源代码中代码模块间的调用关系表,向调用关系表中的代码模块添加对应的服务方标识,得到对应的代码服务调用关系表。相较于传统的通过服务注册中心获取服务间调用关系,本方案在代码运行前通过遍历语法树的方式得到代码中的服务调用关系,提高了代码的可维护性。
附图说明
53.图1为一个实施例中代码服务调用关系生成方法的应用环境图;
54.图2为一个实施例中代码服务调用关系生成方法的流程示意图;
55.图3为一个实施例中语法解析树获取步骤的流程示意图;
56.图4为一个实施例中方法声明与方法调用关系确定步骤的流程示意图;
57.图5为一个实施例中方法调用与方法声明关系确定步骤的流程示意图;
58.图6为一个实施例中服务方确定步骤的流程示意图;
59.图7为另一个实施例中服务方确定步骤的流程示意图;
60.图8为一个实施例中代码服务调用关系表确定步骤的流程示意图;
61.图9为一个实施例中代码服务调用关系表查询步骤的流程示意图;
62.图10为另一个实施例中代码服务调用关系表查询步骤的流程示意图;
63.图11为另一个实施例中代码服务调用关系生成方法的流程示意图;
64.图12为又一个实施例中代码服务调用关系生成方法的流程示意图;
65.图13为一个实施例中代码服务调用关系生成装置的结构框图;
66.图14为一个实施例中计算机设备的内部结构图。
具体实施方式
67.为了使本技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本技术进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本技术,并不用于限定本技术。
68.本技术实施例提供的代码服务调用关系生成方法,可以应用于如图1所示的应用环境中。其中,分布式系统中包括源码解包与文件分发模块、源文件分布式分析模块、调用关系数据存储模块、调用关系数据检索模块和调用关系查询与可视化模块等。分布式系统可以通过其中的各个模块构建待检测代码对应的语法解析树,并通过对语法解析树的遍历,确定待检测源代码中的服务调用关系。在一个实施例中,如图2所示,提供了一种代码服务调用关系生成方法,以该方法应用于图1中的分布式系统为例进行说明,包括以下步骤:
69.步骤s202,获取待检测源代码,对待检测源代码进行语法解析,得到对应的语法解析树;语法解析树中包括与待检测源代码的多个代码模块对应的多个节点,节点之间的关系基于多个代码模块之间的对应关系确定。
70.其中,待检测源代码可以是需要确定服务调用关系的代码。待检测源代码可以是其所在工程中的其中一个源代码文件。服务调用关系是指源代码中属于服务提供方的方法和属于服务消费方的方法之间的调用关系。其中,服务的被调用方是服务的提供者,服务的调用方是消费者,以电影系统为例,一个用户发起了购票的请求,满足请求时查询当前用户的信息,此场景下,电影微服务对应的方法属于服务消费者,用户微服务对应的方法属于服务提供者,用户微服务提供的一个接口被电影微服务消费了。上述对源代码的服务调用关系生成,可以通过分布式系统进行,其中,分布式系统中包括有多个模块,例如源码解包与文件分发模块、源文件分布式分析模块、调用关系数据存储模块、调用关系数据检索模块和调用关系查询与可视化模块等。其中,源码解包与文件分发模块,负责对源文件包进行解包,对解包得到的每一个文件,分发到源文件分布式分析模块进行处理。源文件分布式分析模块,负责对传入源文件建立对应的语法解析树,并从语法解析树中提取方法声明与方法调用关系表、方法调用与方法声明关系表、服务调用方方法表、服务消费方方法表等服务调用关系数据。由于每个源文件的语法解析与分析过程并不相互依赖,对于系统中的每个工程中的每个源文件均可以并行执行。
71.分布式系统可以获取上述待检测源代码,例如工程中的一个源代码文件,并对待检测源代码进行语法解析,得到待检测源代码对应的语法解析树。其中,上述待检测源代码
中包含有多个代码模块,每个代码模块具有对应的功能,例如类的代码模块、方法的代码模块等。语法解析树中包括与上述待检测源代码的多个代码模块对应的多个节点,其中,每个代码模块可以是语法解析树中的一个节点,节点之间的关系可以基于上述多个代码模块之间的对应关系确定。即语法解析树中包括有父节点和子节点,分布式系统可以确定各个代码模块间的父子关系。
72.其中,上述代码模块包括待检测源代码中的属性信息、类信息和方法信息分别对应的模块,则分布式系统可以通过对待检测源代码进行解析,得到上述各个模块的父子关系。例如,在一个实施例中,获取待检测源代码,对待检测源代码进行语法解析,得到对应的语法解析树,包括:检测待检测源码中的声明代码模块;声明代码模块包括属性声明代码模块和类声明代码模块;检测属性声明代码模块中的属性信息代码模块,并检测类声明代码模块中的类信息代码模块、方法声明代码模块和方法声明代码模块对应的方法调用代码模块;将待检测源代码所在的工程作为根节点,将属性声明代码模块、属性信息代码模块和类声明代码模块作为父节点,将类信息代码模块和方法声明代码模块作为类声明代码模块的子节点,将方法调用代码模块作为方法声明代码模块的子节点,得到待检测代码对应的语法解析树。
73.本实施例中,上述待检测源代码可以包含声明代码模块、调用代码模块等。其中声明代码模块表示配置类型的代码模块,包括属性信息的配置、类的配置和方法的配置等,调用代码模块表示使用类型的代码模块,包括对属性信息的使用、对类信息的使用和对方法的使用等。分布式系统可以检测上述待检测源代码中的声明代码模块,例如检测属性声明代码模块和类声明代码模块等。其中属性声明代码模块中可以包含属性信息代码模块,分布式系统可以检测属性声明代码模块中的属性信息代码模块,并检测类声明代码模块中的类信息代码模块、方法声明代码模块和方法声明代码模块对应的方法调用模块。将待检测源代码所在的工程作为根节点,将属性声明代码模块、属性信息代码模块和类声明代码模块作为父节点,将类信息代码模块和方法声明代码模块作为类声明代码模块的子节点,将方法调用代码模块作为方发声明代码模块的子节点,得到待检测源代码对应的语法解析树。
74.其中,上述语法解析树中还可以包括其他类型的节点,具体地,上述待检测源代码的一个例子可以如下所示:
75.package org.example.module1;
76.import org.example.module2.fooservice;
77.import org.example.module2.reference;
78.@service(version="1.0",group="demo-group")
79.public class barserviceimpl implements barservice{
80.@reference(version=1.0",group="demo-group")
81.private fooservice foo;
82.@override
83.public void bar(){
84.foo.fooo;}}
85.以上述待检测源代码为例得到的语法解析树可以如图3所示,图3为一个实施例中
语法解析树获取步骤的流程示意图。其中,语法解析树可以是一种以树状形式对源代码语法结构进行表示的数据结构。分布式系统得到语法解析树的过程可以是一种静态代码扫描过程,是指通过检查软件源代码而非通过运行软件的方式进行软件分析的方法。由图3可知,上述语法解析树所在工程可以包括多个包含源码的源文件,每个源文件可以是一个编译单元,语法解析树中包含包声明、导入声明、属性声明、类声明等父节点,属性声明中包括注解、修饰符和变量声明等子节点,类声明中包括注解、类名和方法声明等子节点,方法声明包括方法名、块声明等子节点,块声明包括方法调用表达式等子节点。上述各个节点均可以是代码模块形式存在。
86.步骤s204,遍历语法解析树,获取语法解析树中方法声明代码模块与其对应的子节点中至少一个方法调用代码模块的第一关系、方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系以及各代码模块所属的服务方;服务方包括服务提供方和服务消费方;代码模块包括方法声明代码模块和方法调用代码模块。
87.其中,分布式系统得到上述语法解析树后,可以对语法解析树进行遍历,得到其中的服务调用关系,服务调用关系指分布式系统内服务提供方与服务消费方之间相互调用的关系。其中,服务调用关系不仅包括服务与服务之间的调用关系,还包括服务和服务之间方法级别的调用关系。上述语法解析树中包含方法声明代码模块对应的节点和方法调用代码模块对应的节点,其中方法声明代码模块和方法调用代码模块之间存在对应关系,分布式系统可以获取语法解析树中方法声明代码模块与其对应的子节点中至少一个方法调用代码模块的第一关系,分布式系统还可以获取方法调用代码模块与其所在的类和该类对应的父类和/或子类中的至少一个方法声明代码模块的第二关系。即确定方法声明代码模块与方法调用代码模块的第一关系时,是基于当前方法声明代码模块所在节点的子节点中寻找其所属的方法调用代码模块得到的;而确定方法调用代码模块与方法声明代码模块的第二关系时,是基于当前方法调用代码模块所在节点的父节点和子节点,以及方法声明代码模块所在的类的父类和子类中是否存在同名方法的方法声明代码模块得到的并且这些同名方法的方法声明代码模块中需要存在方法实现的代码。另外,分布式系统还可以获取上述各代码模块所属的服务方,例如代码模块属于服务提供方还是属于服务消费方。需要确定服务方的代码模块可以是上述方法声明代码模块和方法调用代码模块。
88.具体地,在一个实施例中,遍历语法解析树,获取语法解析树中方法声明代码模块与其对应的子节点中至少一个方法调用代码模块的第一关系、方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系以及各代码模块所属的服务方,包括:遍历语法解析树,根据语法解析树中方法声明代码模块及其对应的子节点中的方法调用代码模块,确定方法声明代码模块与其对应的子节点中至少一个方法调用代码模块的第一关系;根据语法解析树中每个类声明代码模块对应的子节点中的方法调用代码模块和方法声明代码模块,以及每个类声明代码模块对应的父类声明代码模块和子类声明代码模块中的方法声明代码模块,确定方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系;根据语法解析树中的类声明代码模块和属性声明代码模块,确定类声明代码模块中的方法声明代码模块和/或方法调用代码模块所属的服务方。
89.本实施例中,分布式系统可以通过三种遍历方式分别确定上述第一关系、第二关系和服务方信息。其中,分布式系统遍历语法解析树后,可以获取语法解析树中方法声明代码模块及其对应的子节点中的方法调用代码模块,从而分布式系统可以根据语法解析树中的上述方法声明代码模块及其对应的子节点中的方法调用代码模块,确定方法声明代码模块与其对应的子节点中至少一个方法调用代码模块的第一关系。其中,方法声明代码模块与方法调用代码模块的第一关系可以是通过遍历方法声明代码模块所在节点的子节点中的方法调用代码模块得到的关系,分布式系统还可以根据上述第一关系生成对应的方法间调用关系表。
90.分布式系统还可以获取上述语法解析树中的各个类声明代码模块,获取每个类声明代码模块对应的子节点中的方法调用代码模块和方法声明代码模块、获取每个类声明代码模块对应的父节点中的父类声明代码模块以及获取每个类声明代码模块对应的子节点中的子类声明代码模块,检测父类声明代码模块中的方法声明代码模块以及检测子类声明代码模块中的方法声明模块。从而分布式系统可以根据每个类声明代码模块对应的子节点中的方法声明代码模块,以及每个类声明代码模块对应的父类声明代码模块和子类声明代码模块中的方法声明代码模块,确定方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系。即方法调用与方法声明的第二关系可以是自一个类中的方法声明代码所在节点往上寻找父节点中的方法声明代码模块以及往下寻找子节点中的方法声明代码模块的遍历方式,并且不局限于当前类中,还可以在当前类的父类中寻找同名称的方法声明代码模块对应的节点,以及在当前类的子类中寻找同名称的方法声明代码模块对应的节点。分布式系统确定上述方法调用和方法声明的第二关系后,还可以生成第二关系对应的方法调用关系表。
91.上述语法解析树中还包括类声明代码模块和属性声明代码模块,分布式系统可以根据语法解析树中的类声明代码模块和属性声明代码模块,确定类声明代码模块中的方法声明代码模块所属的服务方,还可以确定类声明代码模块中的方法调用代码模块所属的服务方。具体地,分布式系统可以基于上述类声明代码模块和属性声明代码模块中的注释信息,确定类声明代码模块中的方法声明代码模块属于服务提供方还是服务消费方,还可以确定类声明代码模块中的方法调用代码模块属于服务提供方还是服务消费方。分布式系统确定上述方法声明代码模块和方法调用代码模块所属的服务方后,可以生成包含方法声明代码模块、方法调用代码模块以及上述各个代码模块所属的服务方的服务方关系表。
92.步骤s206,根据第一关系和第二关系,确定待检测源代码中代码模块间的调用关系表,并根据代码模块所属的服务方,向调用关系表中的代码模块添加对应的服务方标识,得到待检测源代码对应的代码服务调用关系表。
93.其中,上述第一关系可以是方法声明代码模块与方法调用代码模块的关系,第二关系可以是方法调用代码模块和方法声明代码模块的关系,其中第一关系是以方法声明代码模块为起点,寻找子节点中的方法调用代码模块的方式,第二关系可以是以方法调用代码模块为起点,寻找当前类以及当前类的父类中的同名称方法声明代码模块的方式。分布式系统可以基于上述第一关系和第二关系,确定待检测源代码中各个代码模块间的调用关系表,具体地,可以是方法声明代码模块和方法调用代码模块各自之间的调用关系表,该调用关系表中可以包括作为起始节点的方法声明代码模块,以及若干个与该起始节点关联的
子节点,每个子节点可以是方法声明代码模块,也可以是方法调用代码模块。
94.分布式系统确定上述调用关系表后,还可以根据上述各个代码模块所属的服务方,向调用关系表中的代码模块添加对应的服务方标识,得到待检测源代码对应的代码服务调用关系表。其中,上述服务方标识包括服务提供方的标识和服务消费方的标识,若分布式系统检测到代码服务调用关系表中的方法声明代码模块属于服务提供方或者检测到方法调用代码模块属于服务消费方,则分布式系统可以向对应的代码模块添加相应的服务方标识。其中,分布式系统可以在检测到方法声明代码模块属于起始节点,或方法调用模块属于最末的子节点时,才添加对应的服务方标识。
95.上述代码服务调用关系生成方法中,通过遍历待检测源代码对应的语法解析树,获取语法解析树中方法声明代码模块与其子节点中至少一个方法调用代码模块的第一关系、方法调用模块与其所在的类和对应的父类中的至少一个方法声明代码模块的第二关系以及各代码模块所属的服务方,并根据第一关系和第二关系,确定待检测源代码中代码模块间的调用关系表,向调用关系表中的代码模块添加对应的服务方标识,得到对应的代码服务调用关系表。相较于传统的通过服务注册中心获取服务间调用关系,本方案在代码运行前通过遍历语法树的方式得到代码中的服务调用关系,提高了代码的可维护性。
96.在一个实施例中,根据语法解析树中方法声明代码模块及其对应的子节点中的方法调用代码模块,确定方法声明代码模块与其对应的子节点中至少一个方法调用代码模块的第一关系,包括:获取语法解析树中的方法声明代码模块,并检测方法声明代码模块包含的子树,获取子树中的方法调用代码模块;建立方法声明代码模块与子树中的方法调用代码模块的第一关系。
97.本实施例中,分布式系统可以通过对语法解析树的遍历,得到方法声明代码模块和方法调用代码模块的第一关系。其中,上述语法解析树中包含有多种树状结构,分布式系统可以获取语法解析树中的方法声明代码模块,该方法声明代码模块可以出现在类声明代码模块的子树的节点中。并且方法声明代码模块也具有对应的子树节点,分布式系统可以检测方法声明代码模块包含的子树中的节点,获取子树中的方法调用代码模块,其中,子树中的方法调用代码模块可以有一个或多个,分布式系统可以将子树中所有的方法调用代码模块作为该方法声明代码模块对应的方法调用代码模块。从而分布式系统可以建立上述方法声明代码模块与子树中的方法调用代码模块的第一关系。
98.具体地,以如图4中的语法解析树为例,图4为一个实施例中方法声明与方法调用关系确定步骤的流程示意图。分布式系统确定方法声明代码模块和方法调用代码模块的第一关系时,可以通过对语法解析树的遍历,可以得到方法声明a。进一步地,通过搜索方法声明a的所有子树,找到子树中的所有方法调用表达式,例如图4中的方法调用表达式b。另外,分布式系统还可以判断方法调用表达式是否为系统内部方法调用,若判断方法调用表达式b中的方法为系统内部方法调用,则生成一条方法声明a到方法调用b的调用关系记录。其中,图4中的各个节点均可以是一个个代码模块,则上述方法声明a即是一种方法声明代码模块,上述方法调用表达式b即为一种方法调用代码模块。系统内方法调用是指一类方法调用语句,其特征为该语句中的方法由本it系统内部声明和实现。由于企业it系统内部与系统外部往往不存在服务调用关系。因此区分系统内方法调用和系统外方法调用,并仅分析系统内方法调用代码语句,有助于提升分析系统处理效率。
99.通过本实施例,分布式系统可以通过遍历语法解析树中的方法声明代码模块和方法调用代码模块,确定第一关系,从而分布式系统可以基于第一关系确定待检测源代码中的服务调用关系,提高对待检测源代码的可维护性。
100.在一个实施例中,根据语法解析树中每个类声明代码模块对应的子节点中的方法调用代码模块和方法声明代码模块,以及每个类声明代码模块对应的父类声明代码模块和子类声明代码模块中的方法声明代码模块,确定方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系,包括:获取语法解析树中每个类声明代码模块的子树中的方法声明代码模块,若检测到子树中的方法声明代码模块中存在方法实现代码,则建立子树中的方法声明代码模块对应的方法调用代码模块与子树中的方法声明代码模块的当前类第二关系;确定每个类声明代码模块的父子关系,并获取语法解析树中每个类声明代码模块对应的父类声明代码模块和子类声明代码模块;针对每个类声明代码模块,若检测到该类声明代码模块对应的父类声明代码模块中,存在包含方法实现代码的父方法声明代码模块,则建立该类声明代码模块对应的第一目标方法调用代码模块与父方法声明代码模块的父类第二关系;第一目标方法调用代码模块的方法名称与父方法声明代码模块的方法名称相同;若检测到该类声明代码模块对应的子类声明代码模块中,存在包含方法实现代码的子方法声明代码模块,则建立该类声明代码模块对应的第二目标方法调用代码模块与子方法声明代码模块的子类第二关系;第二目标方法调用代码模块的方法名称与子方法声明代码模块的方法名称相同;根据当前类第二关系、父类第二关系和子类第二关系,得到方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系。
101.本实施例中,分布式系统可以通过遍历语法解析树确定方法调用代码模块与方法声明代码模块的第二关系,该第二关系可以是自当前类的方法声明代码模块往语法解析树中的上层节点和下层节点中遍历得到的关系。例如,分布式系统可以获取语法解析树中每个类声明代码模块的子树中的方法声明代码模块,若检测到子树中的方法声明代码模块中存在方法实现代码,则建立子树中的方法声明代码模块对应的方法调用代码模块与子树中的方法声明代码模块的当前类第二关系。其中,当前类第二关系表示在上述类声明代码模块对应的类中,方法调用代码模块和方法声明代码模块的第二关系。分布式系统还可以确定上述每个类声明代码模块的父子关系,并获取语法解析树中每个类声明代码模块对应的父类声明代码模块和子声明代码模块。其中,上述类声明代码模块可以包括多个,每个类声明代码模块之间可以存在父类和子类的关系,对于每个类声明代码模块,若分布式系统检测到该类声明代码模块对应的父类声明代码模块中,存在包含方法实现代码的父方法声明代码模块,则分布式系统可以建立该类声明代码模块对应的第一目标方法调用代码模块与父方法声明代码模块的父类第二关系。其中,第一目标调用代码模块的方法名称与父方法声明代码模块的方法名称相同,即上述父类第二关系表示分别存在于不同类的方法声明代码模块对应的方法调用代码模块和方法声明代码模块的第二关系,且方法调用代码模块是在上述子类中。
102.其中,分布式系统还可以在检测到该类声明代码模块对应的子类声明代码模块中,是否存在包含方法实现代码的子方法声明代码模块,若是,则分布式系统可以建立该类声明代码模块对应的第二目标方法调用代码模块与上述子方法声明代码模块的子类第二
关系。其中,上述第二目标方法调用代码模块的方法名称与子方法声明代码模块的方法名称相同,即上述子类第二关系表示分别存在与不同类的方法声明代码模块对应的方法调用代码模块和方法声明代码模块的第二关系,且方法调用代码模块是在父类中。
103.分布式系统得到上述当前类第二关系、父类第二关系和子类第二关系后,可以基于当前类第二关系、父类第二关系和子类第二关系,得到方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系,即一个方法调用代码模块可以对应有一个或多个方法声明代码模块,并且分布式系统还可以基于上述第二关系建立对应的调用关系表。具体地,以如图5所示的语法解析树为例,图5为一个实施例中方法调用与方法声明关系确定步骤的流程示意图。分布式系统可以根据如图5的树状结构确定其中的方法调用代码模块与方法声明代码模块的第二关系,包括当前类第二关系、父类第二关系和子类第二关系等。分布式系统可以从语法解析树中获取类以及其对应的父类之间的关系,并记入类与其父类关系表。如图5所示,分布式系统可由语法解析树可找到类声明b,由于类声明b的子节点中含有类或接口类型a,因此分布式系统可以得到类型a为类型b的父类或者接口,并将该关系记入类与其父类关系表,同理可以获得类型b为类型c的父类或接口,类型c为类型b的子类。分布式系统可以建立方法调用与方法声明的关系表。其中,一个方法调用与方法声明通常存在三种关系:方法调用主体调用本类中声明的方法,即当前类第二关系;方法调用主体调用其父类中声明的方法,即父类第二关系;方法调用主体调用子类中声明的方法,即子类第二关系。对上述三种情况,如图5所示,对于当前类第二关系,例如对于类声明a,分布式系统可以找到其所有方法声明,比如a.a()。如果分布式系统检测到该方法仅为方法接口声明并不包含方法的实现,则说明该方法由其子类实现,不记入方法调用与方法声明的关系表。如果该方法声明中包含具体的方法实现,则分布式系统可以记入方法调用与方法声明的关系表,即得到方法调用a.a到方法声明a.a的映射关系,作为当前类第二关系。并且,分布式系统还可以根据该条记录中的类声明,寻找其是否存在父类,以及父类中是否存在同名方法。若存在同名方法,则表示该方法调用同时也对应该父类中的方法声明,分布式系统可以将上述方法调用和父类中的方法声明的第二关系记入方法调用与方法声明关系表。如图5所示,对于父类第二关系,例如对于类声明b,分布式系统可以按上一步的方法得到方法调用b.b到方法声明b.b的映射关系。此外,由于类b继承了类a,虽然类b中没有声明方法a,但分布式系统可以通过继承关系调用方法b.a。因此分布式系统可以获得一条隐式的映射关系,即方法调用b.a到方法声明a.a的映射关系,作为上述父类第二关系。另外,分布式系统还可以根据该条记录中的类声明,寻找其是否存在子类,以及子类中是否存在同名方法,是则表示当前类中的方法调用时,可能调用的是子类中的方法,因此,分布式系统可以建立当前类中的方法调用与其子类中的方法声明之间的第二关系。如图5所示,对于类型声明c,首先分布式系统可以由继承关系可获得一条隐式调用关系,即方法调用c.a到方法声明a.a。其次由于类声明c中声明了方法b,因此分布式系统可以建立方法调用c.b到方法声明c.b的映射关系。另外,由于方法c.b覆盖了其父类方法b.b,因此当调用b.b时,其方法的实现可能为c.b。故分布式系统可以建立方法调用b.b到c.b的映射关系,作为上述子类第二关系。
104.通过本实施例,分布式系统可以通过遍历语法解析树中的类与父类和子类的关系,以及每个类中的方法声明代码模块和方法调用代码模块,基于同名方法确定在同一个
类或跨类的第二关系,从而分布式系统可以基于第二关系确定待检测源代码中的服务调用关系,提高对待检测源代码的可维护性。
105.在一个实施例中,根据语法解析树中的类声明代码模块和属性声明代码模块,确定类声明代码模块中的方法声明代码模块和/或方法调用代码模块所属的服务方,包括:获取语法解析树中类声明代码模块的子节点中的类信息代码模块;若类信息代码模块对应的类信息为服务提供方,确定类声明代码模块对应的方法声明代码模块属于服务提供方;和/或,获取语法解析树中属性声明代码模块对应的属性信息代码模块;若属性信息代码模块对应的属性信息包含服务消费方,且语法解析树中的方法调用代码模块的调用主体为属性信息,确定方法调用代码模块属于服务消费方。
106.本实施例中,上述代码模块所属的服务方包括服务提供方和服务消费方,分布式系统可以通过检测类声明代码模块和属性声明代码模块,确定方法声明代码模块和方法调用代码模块属于的服务方。例如,分布式系统可以获取上述语法解析树中类声明代码模块的子节点中的类信息代码模块,若分布式系统检测到该类信息代码模块对应的类信息为服务提供方,则分布式系统确定类声明代码模块对应的方法声明代码模块属于服务提供方。其中,分布式系统确定代码模块所属的服务方后,还可以生成相应的表格,该表格与服务方的属性对应,对于服务提供方,生成的表格为服务提供方方法表。具体地,分布式系统可以从语法解析树中找到类声明节点,如果该节点的子节点中带有服务提供方声明注解,则分布式系统可以为该类中的每一个方法建立一条服务提供方方法记录,并记入服务提供方方法表。以图6所示的语法解析树为例,图6为一个实施例中服务方确定步骤的流程示意图。分布式系统可以在语法解析树中检测到类声明“barserviceimpl”及其对应的包声明“org.example.module1”;分布式系统可以判断该类的子节点是否带有服务提供方声明注解,如图6所示的子节点中带有服务提供方声明注解“@service(version=”1.0”,group=”demo-group”)”,则分布式系统可以将该类声明中所属的方法声明“bar()”记入服务提供方方法表。
107.其中,除了服务提供方外,分布式系统还可以检测上述语法解析树中的方法调用代码模块是否属于服务消费方。分布式系统可以获取语法解析树中属性声明代码模块对应的属性信息代码模块,并检测属性信息代码模块中的属性信息,若分布式系统检测到属性信息代码模块对应的属性信息包含服务消费方,且上述语法解析树中的方法调用代码模块的调用主体为上述属性信息,则分布式系统可以确定上述方法调用代码模块属于服务消费方。具体地,分布式系统在检测服务消费方时,可以从语法解析树中获取所有的属性声明,若分布式系统检测到属性声明存在服务消费方声明注解,则分布式系统可以将该字段标识为服务消费方属性声明。若分布式系统检测到语法解析树中方法调用表达式中的方法调用主体为该属性声明,则将该方法调用记入服务消费方方法表。以图7所示的语法解析树为例,图7为另一个实施例中服务方确定步骤的流程示意图。由于属性声明“fooservice foo”带有服务消费方声明注解“@reference(version=”1.0”,group=”demo-group”)”,则分布式系统可以将该属性声明标识为服务消费方属性。如图7所示的语法解析树中存在方法调用表达式“foo.foo()”,则分布式系统可以将该方法调用记入服务消费方方法表。
108.另外,在一些实施例中,服务提供方和服务消费方方法并非通过注解类型声明,还可以是通过结构化配置文件声明的场景,比如xml格式、yaml格式,则分布式系统可通过领
域内通用的解析方法进行解析,得到服务提供方和服务消费方类名,并按上述方法判断相关的方法声明和方法调用表达式是否为服务提供方方法和服务消费方方法,并记入相应的表。并且,分布式系统中可以存在不止一个待检测源代码,分布式系统可以对工程中所有源代码均进行上述第一关系、第二关系和服务方确定的步骤,从而得到每个源代码对应的服务调用关系。
109.通过本实施例,分布式系统可以基于属性信息和类信息确定方法声明代码模块和方法调用代码模块的服务方,从而分布式系统可以基于各个代码模块的服务方确定服务调用关系,提高了对代码的可维护性。
110.在一个实施例中,根据第一关系和第二关系,确定待检测源代码中代码模块间的调用关系表,包括:根据第一关系,确定方法声明代码模块与方法调用代码模块的第一关联关系;根据第二关系,确定方法调用代码模块与方法声明代码模块的第二关联关系;若第二关联关系中方法调用代码模块对应的方法声明代码模块存在于第一关联关系中,建立第一关联关系中方法调用代码模块对应的方法声明代码模块与第二关联关系中方法调用代码模块对应的方法声明代码模块的第三关联关系;根据第一关联关系、第二关联关系和第三关联关系,确定代码模块间的调用关系表。
111.本实施例中,分布式系统确定上述方法声明代码模块与方法调用代码模块的第一关系和方法调用代码模块与方法声明代码模块的第二关系后,可以确定对应的调用关系表,该调用关系表可以表示为方法间的调用关系表。例如,分布式系统可以根据上述第一关系、确定方法声明代码模块与方法调用代码模块的第一关联关系,并根据第二关系,确定方法调用代码模块与方法声明代码模块的第二关联关系。分布式系统可以检测第二关联关系中方法调用代码模块对应的方法声明代码模块是否存在与第一关联关系中,若存在,则分布式系统可以建立第一关联关系中方法调用代码模块对应的方法声明代码模块与第二关联关系中方法调用代码模块对应的方法声明代码模块的第三关联关系。从而分布式系统可以根据上述第一关联关系、第二关联关系和第三关联关系,确定代码模块间的调用关系表。
112.其中,上述待检测源代码所在工程中可以包括多个源代码,分布式系统可以分别获取每个源代码中的第一关系、第二关系以及相应的服务方信息,并基于所有源代码的第一关系和第二关系确定调用关系表,以及基于所以源代码的服务方信息确定代码服务调用关系表。具体地,上述第一关系、第二关系和服务方信息均有对应的表格。分布式系统可以基于第一关系对应的方法声明与方法调用关系表、第二关系对应的方法调用与方法声明关系表、服务调用方方法表、服务消费方方法表进行聚合分析,得到上述工程内服务提供方方法到服务消费方方法的调用关系。以图8为例,图8为一个实施例中代码服务调用关系表确定步骤的流程示意图。分布式系统可以根据方法声明与方法调用关系表,方法调动与方法声明关系表,建立方法之间的调用关系图。
113.分布式系统还可以向调用关系表中的各个代码模块添加服务方标识。例如,在一个实施例中,根据代码模块所属的服务方,向调用关系表中的代码模块添加对应的服务方标识,得到待检测源代码对应的代码服务调用关系表,包括:针对调用关系表中的每个方法声明代码模块,若该方法声明代码模块属于服务提供方,且该方法声明代码模块在调用关系表中不存在父关联关系,向该方法声明代码模块添加服务提供方标识;针对调用关系表中的每个方法调用代码模块,若该方法调用代码模块属于服务消费方,且该方法调用代码
模块在调用关系表中不存在子关联关系,向该方法调用代码模块添加服务消费方标识;根据添加服务提供方标识和服务消费方标识后的调用关系表,得到代码服务调用关系表。
114.本实施例中,上述调用关系表中的方法声明代码模块可以有多个,但不是每个方法声明代码模块均需要添加服务方标识。对于调用关系表中的每个方法声明代码模块,分布式系统可以检测该方法声明代码模块是否属于服务提供方,且检测该方法声明代码模块在调用关系表中不存在父关联关系,即不存在父节点,则分布式系统可以向该方法声明代码模块添加服务提供方标识。上述调用关系表中的方法调用代码模块也可以有多个,对于调用关系表中的每个方法调用代码模块,分布式系统可以检测该方法调用代码模块是否属于服务消费方,且检测该方法调用代码模块在调用关系表中不存在子关联关系,即不存在子节点,则分布式系统可以向该方法调用代码模块添加服务消费方标识。
115.具体地,上述代码模块与其对应的服务方信息可以形成相应的表格。包括服务提供方方法表和服务消费方方法表,分布式系统可以根据服务提供方方法表和服务消费方方法表,在方法间调用关系图中分别标注出服务提供方方法和服务消费方方法。如图8所示,分布式系统可以根据上述第一关系对应的方法声明与方法调用关系表,得到方法声明a中包含方法调用b和方法调用c。对其中方法调用b,分布式系统可以根据第二关系对应的方法调用与方法声明关系表,得到其有两个关联的方法声明,即方法声明d和方法声明e。对于方法声明d,分布式系统可以根据方法声明与方法调用关系表,得到其包含了方法调用e。分布式系统可以通过上述方法以此类推,得到工程中所有方法调用关系图。最后分布式系统可以根据服务提供方方法表和服务消费方方法表,对方法进行标注。其中,上述工程文件可以不只一个工程文件,分布式系统可以对分布式系统中每个工程进行遍历,并对每个工程均进行上述代码服务调用关系表的确定,从而得到分布式系统中所有服务间方法级的调用关系。
116.通过上述实施例,分布式系统可以基于第一关系、第二关系和各个代码模块对应的服务方信息,确定待检测源代码的代码服务调用关系表,提高了代码的可维护性。
117.在一个实施例中,得到待检测源代码对应的代码服务调用关系表之后,还包括:接收代码服务调用关系查询信息,获取代码服务调用关系查询信息中的工程标识、类标识和方法标识;根据工程标识查询对应的工程,根据类标识在工程中查询对应的类名称,并根据方法标识在类名称对应的类中查询对应的方法名称;获取包含方法名称的代码服务调用关系表,作为查询结果。
118.本实施例中,分布式系统得到上述代码服务调用关系表后,还可以基于相应标识对代码服务调用关系表进行查询。在查询时,分布式系统可以接收代码服务调用关系查询信息,获取代码服务调用关系查询信息中的工程标识、类标识和方法标识,分布式系统可以根据工程标识查询对应的工程,并根据类标识在工程中查询对应的类名称,根据上述方法标识在类名称对应的类中查询对应的方法名称,从而分布式系统可以获取包含方法名称的代码服务调用关系表,作为查询结果。具体地,上述查询可以是一种多级查询,即基于多个标识对代码服务调用关系表的方法进行查询。如图9所示,图9为一个实施例中代码服务调用关系表查询步骤的流程示意图。分布式系统可以基于上述生成的服务提供方方法表和服务消费方方法表,得到方法的唯一标识。唯一标识包括“服务版本”、“服务群组”、“包名”、“类名”、“方法名”五个字段。从而分布式系统可以根据服务提供方方法和服务消费方方法
的唯一标识,建立服务提供方多级哈希索引和服务消费方多级哈希索引,并且分布式系统还可以建立对应的反向索引。分布式系统可以根据服务提供方方法的唯一标识,依次按照“服务群组”、“服务版本”、“包名”、“类名”、“方法名”的顺序建立对应的哈希表。对于服务群组哈希表,其中的每一条记录的key为服务群组名的哈希值,value为服务版本哈希表的地址。同理可获得其他各哈希表的key和value。在进行索引查询时,分布式系统可以从服务群组哈希表中根据服务群组名哈希值找到对应的服务版本哈希表,再根据服务版本哈希值,从服务版本哈希表中找到包名哈希表。以此类推,直到通过服务提供方方法名哈希值,找到方法声明与方法调用关系表中的对应记录。通过该查询索引,分布式系统可根据服务提供方方法唯一标识在o(1)时间复杂度内快速检索到服务调用关系。同样地,分布式系统还可以按照上述方法根据服务消费方方法唯一标识建立服务消费方多级哈希索引。
119.另外,分布式系统还可以通过反向索引方式查询调用关系表。具体地,如图10所示,图10为另一个实施例中代码服务调用关系表查询步骤的流程示意图。分布式系统可以依次按照“包名”、“类名”、“方法名”、“群组名”、“服务版本”方式,建立多级哈希索引。当按照全限定类名进行检索时,如果按照前述的正向索引方法需要o(n)的时间复杂度,而按照反向索引可以将查询性能提升至o(1)。
120.通过上述实施例,分布式系统可以基于多级哈希索引,通过正向查询和反向查询的方式得到调用关系表中的方法,从而提高了方法代码模块的查询效率。
121.在一个实施例中,如图11所示,图11为另一个实施例中代码服务调用关系生成方法的流程示意图。本实施例中,分布式系统可以将源文件进行解包,并通过多个节点对各个源文件进行分析。具体地,当源文件包由解包与源文件分发模块处理后,源文件被分发到源文件分布式分析模块中的每个节点,每个节点独立处理一个源文件,不存在依赖关系。各源文件分析节点处理完后,将生成的服务调用关系数据分别上送至调用关系数据存储模块。其中,调用关系数据存储模块,负责对声明与方法调用关系表、方法调用与方法声明关系表、服务调用方方法表、服务消费方方法表等服务调用关系数据进行存储。上述调用关系数据检索模块,负责根据前述索引生成方法,对服务调用关系数据建立索引。上述调用关系查询与可视化模块,负责根据索引查询服务调用关系,并进行可视化。
122.其中,对于每个源文件的语法分析,其流程可以如图12所示,图12为又一个实施例中代码服务调用关系生成方法的流程示意图。分布式系统可以对工程中的每个源文件进行语法分析,得到对应的语法解析树,其中源文件可以是上述待检测源代码,分布式系统可以对语法解析树进行分析,得到语法解析树中方法声明与方法调用关系表、方法调用与方法声明关系表、服务提供方方法表和服务消费方方法表。分布式系统可以遍历上述工程中所有源代码文件,对每个文件均进行上述各个关系对应的表的获取以及各个服务方信息的确定,从而分布式系统可以对上述所有得到的方法声明与方法调用关系表、方法调用与方法声明关系表、服务调用方方法表、服务消费方方法表进行聚合分析,得到该工程内服务提供方方法到服务消费方方法的调用关系,即上述代码服务调用关系表。分布式系统还可以遍历上述分布式系统内的所有工程,并得到每个工程对应的代码服务调用关系表,进而得到分布式系统中所有服务间方法级的调用关系。
123.通过上述实施例,分布式系统通过在代码运行前通过遍历语法树的方式得到代码中的服务调用关系,提高了代码的可维护性。
124.应该理解的是,虽然如上所述的各实施例所涉及的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,如上所述的各实施例所涉及的流程图中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
125.基于同样的发明构思,本技术实施例还提供了一种用于实现上述所涉及的代码服务调用关系生成方法的代码服务调用关系生成装置。该装置所提供的解决问题的实现方案与上述方法中所记载的实现方案相似,故下面所提供的一个或多个代码服务调用关系生成装置实施例中的具体限定可以参见上文中对于代码服务调用关系生成方法的限定,在此不再赘述。
126.在一个实施例中,如图13所示,提供了一种代码服务调用关系生成装置,包括:获取模块500、遍历模块502和生成模块504,其中:
127.获取模块500,用于获取待检测源代码,对待检测源代码进行语法解析,得到对应的语法解析树;语法解析树中包括与待检测源代码的多个代码模块对应的多个节点,节点之间的关系基于多个代码模块之间的对应关系确定。
128.遍历模块502,用于遍历语法解析树,获取语法解析树中方法声明代码模块与其对应的子节点中至少一个方法调用代码模块的第一关系、方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系以及各代码模块所属的服务方;服务方包括服务提供方和服务消费方;代码模块包括方法声明代码模块和方法调用代码模块。
129.生成模块504,用于根据第一关系和第二关系,确定待检测源代码中代码模块间的调用关系表,并根据代码模块所属的服务方,向调用关系表中的代码模块添加对应的服务方标识,得到待检测源代码对应的代码服务调用关系表。
130.在一个实施例中,上述获取模块500,具体用于检测待检测源码中的声明代码模块;声明代码模块包括属性声明代码模块和类声明代码模块;检测属性声明代码模块中的属性信息代码模块,并检测类声明代码模块中的类信息代码模块、方法声明代码模块和方法声明代码模块对应的方法调用代码模块;将待检测源代码所在的工程作为根节点,将属性声明代码模块、属性信息代码模块和类声明代码模块作为父节点,将类信息代码模块和方法声明代码模块作为类声明代码模块的子节点,将方法调用代码模块作为方法声明代码模块的子节点,得到待检测代码对应的语法解析树。
131.在一个实施例中,上述遍历模块502,具体用于遍历语法解析树,根据语法解析树中方法声明代码模块及其对应的子节点中的方法调用代码模块,确定方法声明代码模块与其对应的子节点中至少一个方法调用代码模块的第一关系;根据语法解析树中每个类声明代码模块对应的子节点中的方法声明代码模块,以及每个类声明代码模块对应的父类声明代码模块和子类声明代码模块中的方法声明代码模块,确定方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系;根据语法解析树中的类声明代码模块和属性声明代码模块,确定类声明代码模块中的方法声明代码模块和/
或方法调用代码模块所属的服务方。
132.在一个实施例中,上述遍历模块502,具体用于获取语法解析树中的方法声明代码模块,并检测方法声明代码模块包含的子树,获取子树中的方法调用代码模块;建立方法声明代码模块与子树中的方法调用代码模块的第一关系。
133.在一个实施例中,上述遍历模块502,具体用于获取语法解析树中每个类声明代码模块的子树中的方法声明代码模块,若检测到子树中的方法声明代码模块中存在方法实现代码,则建立子树中的方法声明代码模块对应的方法调用代码模块与子树中的方法声明代码模块的当前类第二关系;确定每个类声明代码模块的父子关系,并获取语法解析树中每个类声明代码模块对应的父类声明代码模块和子类声明代码模块;针对每个类声明代码模块,若检测到该类声明代码模块对应的父类声明代码模块中,存在包含方法实现代码的父方法声明代码模块,则建立该类声明代码模块对应的第一目标方法调用代码模块与父方法声明代码模块的父类第二关系;第一目标方法调用代码模块的方法名称与父方法声明代码模块的方法名称相同;若检测到该类声明代码模块对应的子类声明代码模块中,存在包含方法实现代码的子方法声明代码模块,则建立该类声明代码模块对应的第二目标方法调用代码模块与子方法声明代码模块的子类第二关系;第二目标方法调用代码模块的方法名称与子方法声明代码模块的方法名称相同;根据当前类第二关系、父类第二关系和子类第二关系,得到方法调用代码模块与其所在的类以及对应的父类和子类中的至少一个方法声明代码模块的第二关系。
134.在一个实施例中,上述遍历模块502,具体用于获取语法解析树中类声明代码模块的子节点中的类信息代码模块;若类信息代码模块对应的类信息为服务提供方,确定类声明代码模块对应的方法声明代码模块属于服务提供方。
135.在一个实施例中,上述遍历模块502,具体用于获取语法解析树中属性声明代码模块对应的属性信息代码模块;若属性信息代码模块对应的属性信息包含服务消费方,且语法解析树中的方法调用代码模块的调用主体为属性信息,确定方法调用代码模块属于服务消费方。
136.在一个实施例中,上述生成模块504,具体用于根据第一关系,确定方法声明代码模块与方法调用代码模块的第一关联关系;根据第二关系,确定方法调用代码模块与方法声明代码模块的第二关联关系;若第二关联关系中方法调用代码模块对应的方法声明代码模块存在于第一关联关系中,建立第一关联关系中方法调用代码模块对应的方法声明代码模块与第二关联关系中方法调用代码模块对应的方法声明代码模块的第三关联关系;根据第一关联关系、第二关联关系和第三关联关系,确定代码模块间的调用关系表。
137.在一个实施例中,上述生成模块504,具体用于针对调用关系表中的每个方法声明代码模块,若该方法声明代码模块属于服务提供方,且该方法声明代码模块在调用关系表中不存在父关联关系,向该方法声明代码模块添加服务提供方标识;针对调用关系表中的每个方法调用代码模块,若该方法调用代码模块属于服务消费方,且该方法调用代码模块在调用关系表中不存在子关联关系,向该方法调用代码模块添加服务消费方标识;根据添加服务提供方标识和服务消费方标识后的调用关系表,得到代码服务调用关系表。
138.在一个实施例中,上述装置还包括:查询模块,用于接收代码服务调用关系查询信息,获取代码服务调用关系查询信息中的工程标识、类标识和方法标识;根据工程标识查询
对应的工程,根据类标识在工程中查询对应的类名称,并根据方法标识在类名称对应的类中查询对应的方法名称;获取包含方法名称的代码服务调用关系表,作为查询结果。
139.上述代码服务调用关系生成装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
140.在一个实施例中,提供了一种计算机设备,该计算机设备可以是分布式系统,其内部结构图可以如图14所示。该计算机设备包括通过系统总线连接的处理器、存储器、通信接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的通信接口用于与外部的分布式系统进行有线或无线方式的通信,无线方式可通过wifi、移动蜂窝网络、nfc(近场通信)或其他技术实现。该计算机程序被处理器执行时以实现一种代码服务调用关系生成方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
141.本领域技术人员可以理解,图14中示出的结构,仅仅是与本技术方案相关的部分结构的框图,并不构成对本技术方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述的代码服务调用关系生成方法。在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述的代码服务调用关系生成方法。在一个实施例中,提供了一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现上述的代码服务调用关系生成方法。
142.需要说明的是,本技术所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据。
143.本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本技术所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(read-only memory,rom)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(reram)、磁变存储器(magnetoresistive random access memory,mram)、铁电存储器(ferroelectric random access memory,fram)、相变存储器(phase change memory,pcm)、石墨烯存储器等。易失性存储器可包括随机存取存储器(random access memory,ram)或外部高速缓冲存储器等。作为说明而非局限,ram可以是多种形式,比如静态随机存取存储器(static random access memory,sram)或动态随机存取存储器(dynamic random access memory,dram)等。本技术所提供的各实施例中所涉及的数据库可包括关系型数据
库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本技术所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。
144.以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
145.以上所述实施例仅表达了本技术的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本技术专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本技术构思的前提下,还可以做出若干变形和改进,这些都属于本技术的保护范围。因此,本技术的保护范围应以所附权利要求为准。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献