数据血缘关系的处理方法、装置及设备
技术领域
本说明书涉及计算机技术领域,尤其涉及一种数据血缘关系的处理方法、装置及设备。
背景技术
当前业务产品种类迅速膨胀,业务产品之间相互交织,业务系统也变得越来越复杂,例如,财富中的基金申购,可能会跨越了多个(如10个或20个等)系统。在对业务系统进行核对和变更分析时,需要确定用户的每次操作(如基金申购的下单、支付、申购确认等一系列操作)时产生的数据字段对应落在了哪些数据库的哪些表中或哪些字段中,即数据的血缘关系。
通常,人们从数据库层面或者日志层面分析出数据的血缘关系,具体地,将数据库或者日志中的数据进行层层清洗,清洗完成后,通过清洗后的数据信息,利用人工分析的方式分析出数据的血缘关系,但是每次清洗完的数据信息会失去业务上的逻辑关系,为人工分析带来困难,从而使得得到的数据的血缘关系准确性低下,因此,当前需要提供准确性更高或者更可靠的方案。
发明内容
本说明书实施例的目的是提供一种数据血缘关系的处理方法、装置及设备,以实现提高数据的血缘关系准确性的目的。
为解决上述技术问题,本说明书实施例是这样实现的:
本说明书实施例提供的一种数据血缘关系的处理方法,所述方法包括:
根据待分析系统中字节码文件包含的字节码信息确定所述待分析系统中类文件的抽象语法树信息;
基于所述抽象语法树信息获取所述待分析系统中的函数语句;
对所述函数语句进行数据血缘分析,确定所述待分析系统的数据血缘关系。
可选地,所述根据待分析系统中字节码文件包含的字节码信息确定所述待分析系统中类文件的抽象语法树信息,包括:
获取所述待分析系统中的字节码文件;
提取所述字节码文件中包含的关键属性信息;
根据所述关键属性信息生成所述待分析系统的类图,以及所述类图对应的类文件的索引信息;
根据所述类图及所述类图对应的类文件的索引信息,获取相应的类文件;
基于获取的类文件生成对应的类的抽象语法树信息,加载每个类的抽象语法树信息建立抽象语法树的索引信息。
可选地,所述对所述函数语句进行分析,确定所述待分析系统的数据血缘关系,包括:
将所述函数语句拆分为原子语句,并基于所述原子语句,确定所述待分析系统的数据血缘关系。
可选地,所述基于所述原子语句,确定所述待分析系统的数据血缘关系,包括:
根据预设的分析模型,将所述原子语句输入到所述分析模型中进行血缘推演分析,得到所述待分析系统的数据血缘关系。
可选地,所述基于所述原子语句,确定所述待分析系统的数据血缘关系,包括:
获取所述原子语句中的函数参数;
如果所述函数参数为表征函数调用的相关参数,则对所述原子语句进行血缘分析,确定所述待分析系统的数据血缘关系。
可选地,所述方法还包括:
如果所述函数参数不是表征函数调用的相关参数,则获取所述函数参数所表征的相关调用的调用对象标识及调用方法标识,及从所述原子语句中的预定函数变量或所述原子语句所属的类的属性信息中提取所述函数参数的类型信息;
根据所述调用对象标识、调用方法标识和所述类型信息,查询所述原子语句对应函数语句在所述抽象语法树的分析节点;
如果所述对应的函数在所述抽象语法树存在分析节点,则获取所述待分析系统当前的血缘信息;
使用所述待分析系统当前的血缘信息初始化所述分析节点,得到分析后的血缘信息,以更新当前的血缘信息。
可选地,所述方法还包括:
如果所述原子语句对应的函数语句在所述抽象语法树不存在分析节点,且所述原子语句为语言系统类库的调用语句,则将相应的属性的血缘关系添加到对应的对象的血缘关系中;
如果所述原子语句对应的函数语句在所述抽象语法树不存在分析节点,且所述原子语句不是语言系统类库的调用语句,则将操作数据库的血缘信息添加到当前的血缘信息中。
可选地,所述原子语句包括赋值语句、表达式语句和返回return语句。
本说明书实施例提供的一种数据血缘关系的处理装置,所述装置包括:
信息确定模块,用于根据待分析系统中字节码文件包含的字节码信息确定所述待分析系统中类文件的抽象语法树信息;
函数语句获取模块,用于基于所述抽象语法树信息获取所述待分析系统中的函数语句;
数据血缘分析模块,用于对所述函数语句进行数据血缘分析,确定所述待分析系统的数据血缘关系。
可选地,所述信息确定模块,包括:
文件获取单元,用于获取所述待分析系统中的字节码文件;
信息提取单元,用于提取所述字节码文件中包含的关键属性信息;
类图生成单元,用于根据所述关键属性信息生成所述待分析系统的类图,以及所述类图对应的类文件的索引信息;
类文件获取单元,用于根据所述类图及所述类图对应的类文件的索引信息,获取相应的类文件;
信息处理单元,用于基于获取的类文件生成对应的类的抽象语法树信息,加载每个类的抽象语法树信息建立抽象语法树的索引信息。
可选地,所述数据血缘分析模块,用于将所述函数语句拆分为原子语句,并基于所述原子语句,确定所述待分析系统的数据血缘关系。
可选地,所述数据血缘分析模块,用于根据预设的分析模型,将所述原子语句输入到所述分析模型中进行血缘推演分析,得到所述待分析系统的数据血缘关系。
可选地,所述数据血缘分析模块,包括:
参数获取单元,用于获取所述原子语句中的函数参数;
血缘分析单元,用于包括如果所述函数参数为表征函数调用的相关参数,则对所述原子语句进行血缘分析,确定所述待分析系统的数据血缘关系。
可选地,所述装置还包括:
类型信息提取模块,用于如果所述函数参数不是表征函数调用的相关参数,则获取所述函数参数所表征的相关调用的调用对象标识及调用方法标识,及从所述原子语句中的预定函数变量或所述原子语句所属的类的属性信息中提取所述函数参数的类型信息;
分析节点查询模块,用于根据所述调用对象标识、调用方法标识和所述类型信息,查询所述原子语句对应函数语句在所述抽象语法树的分析节点;
血缘信息获取模块,用于如果所述对应的函数在所述抽象语法树存在分析节点,则获取所述待分析系统当前的血缘信息;
更新模块,用于使用所述待分析系统当前的血缘信息初始化所述分析节点,得到分析后的血缘信息,以更新当前的血缘信息。
可选地,所述装置还包括:
所述数据血缘分析模块,用于如果所述原子语句对应的函数语句在所述抽象语法树不存在分析节点,且所述原子语句为语言系统类库的调用语句,则将相应的属性的血缘关系添加到对应的对象的血缘关系中;
如果所述原子语句对应的函数语句在所述抽象语法树不存在分析节点,且所述原子语句不是语言系统类库的调用语句,则将操作数据库的血缘信息添加到当前的血缘信息中。
本说明书实施例提供的一种数据血缘关系的处理设备,所述数据血缘关系的处理设备包括:
处理器;以及
被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器:
根据待分析系统中字节码文件包含的字节码信息确定所述待分析系统中类文件的抽象语法树信息;
基于所述抽象语法树信息获取所述待分析系统中的函数语句;
对所述函数语句进行数据血缘分析,确定所述待分析系统的数据血缘关系。
由以上本说明书实施例提供的技术方案可见,本说明书实施例通过待分析系统中字节码文件包含的字节码信息确定待分析系统中类文件的抽象语法树信息,进而基于该抽象语法树信息获取待分析系统中的函数语句,通过对该函数语句进行数据血缘分析,可以确定待分析系统的数据血缘关系,这样,从待分析系统的程序代码入手,基于字节码信息和抽象语法树分析待分析系统中各业务之间的数据血缘关系,充分利用了待分析系统内部各业务之间的逻辑关系,提高了数据的血缘关系准确性。
附图说明
为了更清楚地说明本说明书实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本说明书一种数据血缘关系的处理方法实施例;
图2为本说明书一种数据血缘关系示意图;
图3为本说明书另一种数据血缘关系示意图;
图4为本说明书另一种数据血缘关系的处理方法实施例;
图5为本说明书又一种数据血缘关系示意图;
图6为本说明书一种待分析系统的血缘推演分析方法实施例;
图7为本说明书一种数据血缘关系的处理装置实施例;
图8为本说明书一种数据血缘关系的处理设备实施例。
具体实施方式
本说明书实施例提供一种数据血缘关系的处理方法、装置及设备。
为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本说明书保护的范围。
实施例一
如图1所示,本说明书实施例提供一种数据血缘关系的处理方法,该方法的执行主体可以为终端设备或服务器,其中的终端设备可以是个人计算机等,服务器可以是独立的一个服务器,也可以是由多个服务器组成的服务器集群。本说明书实施例中的执行主体以服务器为例进行详细说明。该方法具体可以包括以下步骤:
在步骤S102中,根据待分析系统中字节码文件包含的字节码信息确定该待分析系统中类文件的抽象语法树信息。
其中,待分析系统可以是任意系统,例如,可以是某应用程序的后台服务系统,或提供某一项服务的业务系统等,待分析系统可以是一个由一个独立的系统构成,也可以是由多个不同的系统构成的一个可以完成某项业务的系统,例如,业务1的触发位置在应用程序A中,用户触发业务A时,可以通过应用程序A的后台服务系统和业务1所处的业务服务系统,最后到达业务1的服务系统,这样就需要经过上述后台服务系统、业务服务系统和业务1的服务系统等三个系统。字节码文件可以是用于存储字节码信息的文件,在实际应用中,字节码文件可以是以.class为后缀的文件,在实际应用中,字节码文件可以是类文件。字节码信息可以是由程序代码和/或数据对组成的二进制信息。类文件可以是一种经过计算机编译的文件,可以是由计算机能够识别的语言组成的文件。抽象语法树信息可以是源代码的抽象语法结构的树状表现形式的信息。抽象语法树上的每个节点可以表示源代码中的一种结构。
在实施中,可以获取待分析系统中的字节码文件,例如,可以从待分析系统中选取文件后缀为.class的文件,其中,.class文件即可以为字节码文件。可以对每个字节码文件进行解析,得到其中包含的字节码信息,其中的字节码信息中可以包括类名称信息、继承的父类的名称、类的泛型信息、类的属性列表、类函数列表和实现的接口类名称列表等。其中的类属性列表中可以包括属性类型和属性名称等,其中的类函数列表中可以包括函数名称、入参和返回参数等。
通过得到的字节码信息可以体现出待分析系统的静态结构,尤其是可以确定待分析系统中存在的类、类的内部结构以及与其它类之间的关系等。可以通过待分析系统中存在的类、类的内部结构以及与其它类之间的关系等相关信息获取相应的源代码文件或者是类文件。可以依次遍历获取到的类文件,可以加载每个类的源代码的抽象语法结构的相关信息,进而得到抽象语法树信息,从而可以得到该待分析系统中类文件的抽象语法树信息。
需要说明的是,为了后续可以使用抽象语法树信息对程序代码进行相应的处理,还可以依据每个类的源代码的抽象语法结构建立类方法到某指定方法的语法分析树的索引和/或类文件名称到类的抽象语法树之间的映射关系等,抽象语法树信息中可以包括上述索引或映射关系,这样,可以通过建立的上述索引或映射关系完成上述处理。
在步骤S104中,基于上述抽象语法树信息获取待分析系统中的函数语句。
其中,函数语句可以是待分析系统中的程序代码的任意代码语句,例如函数调用语句、循环语句、赋值语句等。
在实施中,可以通过抽象语法树信息中每个类的源代码的抽象语法结构,建立类方法到某指定方法的语法分析树的索引,并通过抽象语法树信息和上述索引获取每个类的源代码。可以对每个类的源代码进行分析,从中查找到包含预定函数的语句,即函数语句。或者,可以通过抽象语法树信息中类文件名称到类的抽象语法树映射关系获取相应的类文件,可以对该类文件的源代码进行分析,从中查找到包含预定函数的语句,即函数语句。其中,待分析系统中的程序代码可以包括待分析系统自身包含的程序代码,也可以包括进入待分析系统的外部程序代码。
在步骤S106中,对上述函数语句进行数据血缘分析,确定待分析系统的数据血缘关系。
其中,数据血缘可以是指在完成某项业务接口目标调用的一个过程中,该项业务的最初请求数据都落入了哪些系统的数据库或者文件等存储设备上,其中的一个业务接口目标的执行过程会包含对链路上多个系统的级联调用。
在实施中,可以根据上述抽象语法树信息中类的内部结构以及与其它类之间的关系,以及每个类文件中包含的函数语句,确定每个函数语句与其它函数语句之间的关联关系,以及每个函数语句的上文函数语句和下文函数语句。可以基于上下文函数语句对当前的函数语句进行分析,确定函数语句之间的数据血缘关系,例如,函数语句a=b+c,则可以确定对象a的血缘来源于对象b和对象c,其血缘关系为b+c,可以通过上述方式进一步确定对象b的血缘关系、对象c的血缘关系和b+c的血缘关系,依此进行血缘关系的推演分析,最终确定待分析系统的数据血缘关系。
例如,如图2所示,该业务场景中包含多个系统调用,其中的http/rpc或rpc表示调用请求,每个调用可能存在写入数据库中的表的操作或者读取数据库中的表的操作,则图2的数据血缘关系可以包括:业务接口调用1的入参属性request1到数据库A和数据库B的映射关系。
再例如,如图3所示,图3是业务接口2调用,其中调用系统X是去读取数据库A的数据,然后系统X再进一步进行调用,这样就可以建立起数据血缘关系,即业务接口调用2入参request2和数据库A和数据库B的映射关系。通过上述图2和图3的处理,依次对不同业务接口调用进行血缘分析,最终可以确定待分析系统的数据血缘关系。
本说明书实施例提供一种数据血缘关系的处理方法,通过待分析系统中字节码文件包含的字节码信息确定待分析系统中类文件的抽象语法树信息,进而基于该抽象语法树信息获取待分析系统中的函数语句,通过对该函数语句进行数据血缘分析,可以确定待分析系统的数据血缘关系,这样,从待分析系统的程序代码入手,基于字节码信息和抽象语法树分析待分析系统中各业务之间的数据血缘关系,充分利用了待分析系统内部各业务之间的逻辑关系,提高了数据的血缘关系准确性。
实施例二
如图4所示,本说明书实施例提供了一种数据血缘关系的处理方法,该方法的执行主体可以为服务器或者终端设备,其中的终端设备可以是个人计算机等,服务器可以是独立的一个服务器,也可以是由多个服务器组成的服务器集群。本说明书实施例中的执行主体以服务器为例进行详细说明,对于由终端设备实现的情况,可以参见下述相关内容,在此不再赘述。该方法具体包括如下内容:
在步骤S402中,获取待分析系统中的字节码文件。
在实施中,服务器中用于处理数据血缘关系的系统中可以包括多个功能模块,例如,可以包括代码管理模块和预加载模块等。其中,代码管理模块中包括代码编译子模块和代码管理子模块。代码管理模块可以负责待分析系统的程序代码的更新维护的工作,并当程序代码有更新时,自动触发程序代码的更新下载,并执行将程序代码编译成字节码文件等。
预加载模块中可以包括系统配置文件解析子模块、字节码类图加载子模块和抽象语法树加载子模块等,其中,系统配置文件解析子模块主要负责解析待分析系统的配置文件,例如xml文件等,以及解析待分析系统发布的bean信息,然后,可以存储bean信息对应的实现类的路径和bean信息(其中可以包括bean的属性信息等)。字节码文件可以是编译后以.class为后缀的文件,字节码类图加载子模块可以查找待分析系统中的后缀为.class的文件,从而得到待分析系统中的字节码文件。
在步骤S404中,提取上述字节码文件中包含的关键属性信息。
其中,关键属性信息可以包括类的名称、类的属性信息等,具体可以根据实际情况设定,本说明书实施例对此不做限定。
在实施中,字节码类图加载子模块可以加载待分析系统中指定的或所有的类文件或字节码文件,并获取其中包含的字节码信息。每个字节码文件中可以包括以下信息:类的名称、继承的父类名称、类的属性信息(包括类的属性类型、类的属性名称等)列表,类函数(包括函数名、入参、返回参数等)列表、实现的接口类名称列表,如果对应的类属于泛型类,则还可以包括类的泛型信息等,在实际应用中,可以将上述信息作为关键属性信息。这样,通过字节码类图加载子模块可以加载待分析系统中所有的字节码文件,并可以分析得到其中包含的关键属性信息。
在步骤S406中,根据上述关键属性信息生成待分析系统的类图,以及该类图对应的类文件的索引信息。
其中,类图可以呈现待分析系统的静态结构和内部的关联关系,特别是待分析系统中存在的类、类的内部结构以及与其它类的关系等。索引信息可以是用于从待分析系统中快速查找到相应的类文件的相关信息。
在实施中,为了使得待分析系统中包含的类与类之间的关系更加明确,字节码类图加载子模块可以对上述关键属性信息进行分析,确定当前类的名称和继承的父类名称等,通过分析得到的内容,可以创建待分析系统的类图。其中,该类图中可以包括多种关系,例如继承关系、关联关系、聚合关系、复合关系和依赖关系等,聚合关系和复合关系属于关联关系。尽管类图可以呈现出待分析系统中类与类之间的关系,但是,由于待分析系统中包含的类文件较多,相应的,其包含的类的数量也会较多,这样,类图中呈现的类文件之间的关系仍然较复杂,为此,可以在创建类图之后或创建类图时,进一步创建与该类图相对应的类文件的索引信息,该索引信息中可以包括普通类的名称到类图之间的映射关系和接口到其实现类图之间的映射关系等,从而得到待分析系统中的类文件的索引信息。
在步骤S408中,根据上述类图及该类图对应的类文件的索引信息,获取相应的类文件。
在实施中,预加载模块中的抽象语法树加载子模块可以依次读取待分析系统的类图的相关信息,以及待分析系统中的类文件的索引信息,可以通过类文件的索引信息,从类图中分别获取相应的源代码文件(即字节码文件或类文件)。例如,待分析系统中的类文件的索引信息中包括普通类的名称到类图之间的映射关系,如类A-类图1,则通过该索引信息,可以确定类A对应的类文件和类图1,具体地,可以从上述索引信息中查找到类图1的相关信息(如类图1的名称、编码或其它标识等),然后,再从查找到的类图1中查找到类A对应的类文件,从而获取到相应的类文件。
在步骤S410中,基于获取的类文件生成对应的类的抽象语法树信息,加载每个类的抽象语法树信息建立抽象语法树的索引信息。
在实施中,抽象语法树加载子模块可以对每个类文件进行分析,确定该类文件中的源代码的抽象语法结构,可以通过得到的源代码的抽象语法结构生成对应类的抽象语法树,从而得到相应的抽象语法树信息。可以依次遍历待分析系统中的类文件,加载每个类的抽象语法树信息以建立抽象语法树的索引,其中该索引可以是二级索引,其中,二级索引可以是类方法到当前方法的语法分析树的索引,此外,一级索引可以是类文件的名称到类的首相语法树之间的映射关系。
通过预加载模块中的各个子模块可以完成上述步骤S402~步骤S410的预加载处理,预加载处理完成后,可以对待分析系统中的数据血缘关系进行分析,具体可以包括以下步骤S412和步骤S414。
在步骤S412中,基于上述抽象语法树信息获取待分析系统中的函数语句。
在实施中,服务器中用于处理数据血缘关系的系统中还可以包括数据血缘分析模块,可以根据数据血缘分析模块需要实现的不同功能,将数据血缘分析模块划分为多个子模块,具体可以包括血缘初始化子模块(或称为血缘传递模块)、代码语法解析子模块、血缘推演分析子模块和血缘回溯子模块。
其中,血缘初始化子模块通常包括两种处理情况,第一种处理情况可以是作为血缘分析的入口,此时,血缘初始化模块就成为待分析系统中数据血缘的初始端。可以将该血缘初始化子模块的入口处入参的全部属性字段及其所有父类的全部属性字段作为本次数据血缘的输入;第二种处理情况可以是通过某项操作将相应的血缘参数传递到待分析系统内,例如,当程序代码进行函数调用时,待分析系统中会增加一个新的血缘分析节点,在进行迭代分析时会涉及到血缘参数传递。如图5所示,req中字段userid的数据血缘来自于请求request的属性userid,req中字段applyAmount的数据血缘来自于请求request的属性applyAmount。
在实际应用中,通常会包含有三种血缘传递方式,即通过函数参数传递数据血缘、通过对象自带的属性信息传递血缘和全局血缘,其中的全局血缘可以包括线程容器中携带的数据血缘信息等。
为了高效的分析出待分析系统中的数据血缘关系,代码语法解析子模块可以通过抽象语法树信息查找到每一个类文件,获取类文件中的字节码信息(即源代码),可以对类文件中的字节码信息进行分析,并根据分析的结果对字节码信息构成的函数语句进行结构化处理,得到一个或多个函数语句,该函数语句可以包括赋值语句、表达式语句、if-else复合语句、while复合语句、for复合语句、try复合语句、switch复合语句、return语句和其它复合语句等。
在步骤S414中,将上述函数语句拆分为原子语句,并基于该原子语句,确定待分析系统的数据血缘关系。
其中,原子语句可以是在终端设备执行程序代码的过程中不可分割的语句,原子语句能够被终端设备完整执行,且在执行的过程中不会被中断。原子语句可以包括赋值语句、表达式语句和返回return语句。
在实施中,代码语法解析子模块可以将上述得到的函数语句不断进行拆分,得到赋值语句、表达式语句和返回return语句等原子语句。其中,在拆分函数语句时,可以按照函数语句中程序代码的排列顺序,从函数语句中拆分出一个或多个原子语句。
可以对上述三种原子语句进行简化分析,例如,赋值语句可以简化表示为Aa=b+c、Aa=obj.func(b,c)或Aa=func(b,c),其中,Aa表示对象a,b和c表示函数参数,obj为对象,func(b,c)表示关于函数参数b和c的函数表达式,对于Aa=obj.func(b,c),若对象obj不存在,则Aa=obj.func(b,c)就变成了Aa=func(b,c)。表达式语句可以为b+c、obj.func(b,c)和func(b,c)。Return语句可以简化表示为return obj和return obj.func(b,c)等,return语句中通常包含有返回的参数、返回值和相关的数据,可以通过返回的参数、返回值和相关的数据确定对象之间的血缘关系。通过上述原子语句可知,Aa=b+c表示对象a的血缘来自于b和c,并且血缘关系是b+c。因此,血缘推演分析子模块可以通过对函数语句中的上述三种原子语句进行血缘关系的推演分析,确定对象之间的血缘关系,从而得到待分析系统的数据血缘关系。
考虑到待分析系统中的原子语句可能较多,这样在进行血缘推演分析时会消耗较多的时间,因此,为了简化上述处理过程,可以预先设置分析模型,则上述步骤S414的处理具体可以包括以下内容:根据预设的分析模型,将上述原子语句输入到该分析模型中进行血缘推演分析,得到待分析系统的数据血缘关系。
其中,血缘推演分析可以是通过不断的分解、分析程序代码,将数据血缘信息不断的传递给新的对象的过程。
在实施中,可以使用大量样本数据对分析模型进行训练,得到准确率较高的分析模型。然后,可以将拆分得到的原子语句分别输入到分析模型进行血缘推演分析,得到待分析系统的数据血缘关系。
此外,通过上述原子语句可知,例如Aa=b+c,其对象a的血缘来自于b和c,并且血缘关系是b+c,由于b+c是表达式语句,因此,血缘关系的推演实际上就变成了表达式语句的血缘推演,也即是函数调用的血缘推演,而函数调用的血缘推演最重要的就是调用函数的寻找,其中可能会涉及到是父子类方法都存在的函数调用、父类子类方法相互调用、函数重载情况的函数调用、本类的方法调用,函数参数是对另一个函数调用的结果的返回或某方法是一个系统类库的方法调用等。如图6所示,通过上述分析,待分析系统的血缘推演分析具体可以通过以下步骤S502~步骤S516执行。
在步骤S502中,获取上述原子语句中的函数参数。
其中,函数参数可以是用于构成函数的重要元素,通过函数参数可以确定函数的属性等信息,例如,确定某函数参数所在的函数是否为调用函数等。
在实施中,血缘推演分析子模块可以获取每个原子语句,分别从每个原子语句中提取一个或多个函数参数,例如,原子语句A中包括3个函数参数,分别为函数参数1、函数参数2和函数参数3,则血缘推演分析子模块可以得到原子语句A的3个函数参数。
在步骤S504中,如果上述函数参数为表征函数调用的相关参数,则对上述原子语句进行血缘分析,确定待分析系统的数据血缘关系。
在实施中,如果上述函数参数为表征函数调用的相关参数,则可以确定该函数参数所在的函数为调用函数。通过调用函数可以将调用方的血缘信息传递到被调用方,并可以通过血缘回溯子模块中提供的血缘回溯方式确定调用方和被调用方的血缘关系,具体可以为利用实参和形参的映射关系进行血缘过滤并转换成被调用方当前的血缘信息,并可以使用得到的血缘信息更新被调用方的历史血缘信息。然后,可以继续对上述函数参数发起函数调用判断,即上述步骤S502和步骤S504的处理,直到待分析系统中的所有原子语句或函数语句的血缘分析完成,从而得到待分析系统的数据血缘关系。
其中,血缘回溯可以是在进行血缘推演的过程中,可能会遇到函数调用分析,当函数内的血缘分析完成后,需要回溯到调用方,此时,血缘信息需要从被调用方带回调用方的过程。血缘回溯本质上是函数调用增加或修改了调用方的对象属性状态,主要可以抽象为以下3种修改的形式:(1)调用函数通过return语句进行返回,例如,response=invoke.createResponse(request)。(2)对象传递后被调用的函数会修改该对象属性,例如,void fillResponse(FundTradeResponse response){TransferInOrder order=get(TRANSF ER_IN_ORDER);response.setPayAmount(order.getAmount());response.setDate(or der.getTransactionCfmDate());response.setTradeNo(order.getOrderNo());}。(3)调用对象本身会被被调用函数修改,例如,response.setPayAmount(order.getAmount());public void setPayAmount(MoneypayAmount){this.payAmount=payAmount;}。
上述通过血缘回溯子模块中提供的血缘回溯方式确定调用方和被调用方的血缘关系的处理具体可以包括以下内容:如果函数存在返回值,则获取被调用函数的返回对象的名称,依次检查返回的血缘信息是否包含该对象的血缘信息,如果是,则使用返回值名称和调用方的血缘信息更新被调用方的血缘信息。如果否,则结束。通过对象调用函数(被调用的函数修改了对象属性)确定调用方的血缘信息包含被调用方的血缘信息,则可以对被调用方的血缘信息进行覆盖更新。如果确定调用方的血缘信息不包含被调用方的血缘信息,则结束。如果函数调用使用了函数参数,则可以使用返回值名称和调用方的血缘信息更新被调用方的血缘信息。
此外,如果上述函数参数不是表征函数调用的相关参数,则可以判断是否是对象自带的属性信息传递血缘或全局血缘,如果是对象自带的属性信息传递血缘,则可以将该对象的所有血缘信息转换为相应的类的血缘信息,如果是全局血缘,则可以直接进行血缘信息的传递。
对于上述函数参数不是表征函数调用的相关参数的处理方式,除了可以使用上述方式外,还可以使用其他多种方式实现,以下再提供一种可选的处理方式,具体可以参见下述步骤S506~步骤S512。
在步骤S506中,如果上述函数参数不是表征函数调用的相关参数,则获取该函数参数所表征的相关调用的调用对象标识及调用方法标识,及从上述原子语句中的预定函数变量或上述原子语句所属的类的属性信息中提取该函数参数的类型信息。
其中,预定函数变量可以根据实际情况进行设定,本说明书实施例对此不作限定。函数参数的类型信息可以是函数参数所属的类型的相关信息,具体如引用类型或基本类型等。
在步骤S508中,根据上述调用对象标识、调用方法标识和上述类型信息,查询上述原子语句对应函数语句在上述抽象语法树的分析节点。
其中,调用对象标识可以是调用对象的名称、编码等。调用方法标识以是调用方法的名称、编码等。分析节点可以是抽象语法树中该函数所在的类文件对应的节点。
在实施中,如果上述函数参数不是表征函数调用的相关参数,则可以确定相应的原子语句可能是除函数调用外的其它调用,例如,系统调用或宏调用等,其中,系统调用可以是由操作系统提供的所有系统调用所构成的集合(即程序接口或应用编程接口),是应用程序同系统之间的接口。基于上述内容,调用对象可以是上述程序接口或应用编程接口,也可是宏调用对应的对象等。
在步骤S510中,如果上述原子语句对应的函数语句在上述抽象语法树存在分析节点,则获取待分析系统当前的血缘信息。
在实施中,如果上述原子语句对应的函数语句在上述抽象语法树存在分析节点,则可以从抽象语法树中提供的类之间的关联关系,分析确定上述分析节点对应的类与其它类之间的关联关系,可以基于得到的关联关系,确定待分析系统类之间的血缘关系,进而可以得到待分析系统当前的血缘信息。
在步骤S512中,使用待分析系统当前的血缘信息初始化上述分析节点,得到分析后的血缘信息,以更新当前的血缘信息。
此外,如果对应函数在上述抽象语法树不存在分析节点,则可以判断是否是全局血缘,如果是全局血缘,则可以直接进行血缘信息的传递,如果不是全局血缘,则结束。
对于上述对应函数在上述抽象语法树不存在分析节点的处理方式,除了可以使用上述方式外,还可以使用其他多种方式实现,以下再提供一种可选的处理方式,具体可以参见下述步骤S514~步骤S516。
在步骤S514中,如果上述原子语句对应的函数语句在上述抽象语法树不存在分析节点,且上述原子语句为语言系统类库的调用语句,则将相应的属性的血缘关系添加到对应的对象的血缘关系中。
其中,语言系统类库的调用语句可以是使用某种编程语言编写的调用语句,其中编程语言可以包括JAVA编程语言、C语言或C++语言等。
在实施中,如果对应函数在上述抽象语法树不存在分析节点,且上述原子语句为语言系统类库的调用语句,则可以按照普通类库血缘更新原则(例如map的put调用等),将相应的属性的血缘关系添加到对应的对象的血缘关系中。
在步骤S516中,如果上述原子语句对应的函数语句在上述抽象语法树不存在分析节点,且上述原子语句不是语言系统类库的调用语句,则将操作数据库的血缘信息添加到当前的血缘信息中。
在实施中,如果上述原子语句对应的函数语句在上述抽象语法树不存在分析节点,且上述原子语句不是语言系统类库的调用语句,但上述原子语句是调用数据库的调用语句,则将操作数据库的血缘信息添加到当前的血缘信息中。
此外,如果对应函数在上述抽象语法树不存在分析节点,且上述原子语句不是语言系统类库的调用语句,但上述原子语句是调用第三方的调用语句,则可以继续对待分析系统的方法进行血缘分析,以更新当前的血缘信息。
此外,服务器中用于处理数据血缘关系的系统中还可以包括存储展示模块,该存储展示模块可以用于存储数据血缘关系的分析结果,可以根据业务的最原始接口(也可以其他接口),加载出上述接口的数据中的各字段落入了哪些系统的哪些数据库中,以及哪些方法查询使用了该数据中的某字段等。
需要说明的是,待分析系统可以包括多个系统,如图2或图3所示,对于多系统的血缘推演,可以是在不同业务接口之间,虽然在调用过程中可能不存在依赖关系,但是多个系统之间可能会操作(如读操作或写操作)同一份数据(其中的数据不一定是数据库中的数据,还可能是存储的文件中的数据等),通过可以通过上述提供的数据血缘关系的处理方法进行数据血缘关系分析,在此不再赘述。
通过上述方法,不仅可以建立各个数据库直接的血缘关系,还可以建立待分析系统的各业务之间的数据血缘关系。具体地,基于字节码信息和抽象语法树,并配合各种血缘推演方法和规则,自动扫描待分析系统的各业务之间的数据血缘关系,包括应用系统与应用系统之间关键入参和出参的字段级血缘关系、应用系统与数据库之间关键入参属性、出参属性和数据库表字段的血缘关系和数据库与数据库之间的关键表字段之间的血缘关系等。通过建立的上述血缘关系,可以分析关键属性信息或字段的变更影响面,以及自动推导关键字段核对规则分母等。
本说明书实施例提供一种数据血缘关系的处理方法,通过待分析系统中字节码文件包含的字节码信息确定待分析系统中类文件的抽象语法树信息,进而基于该抽象语法树信息获取待分析系统中的函数语句,通过对该函数语句进行数据血缘分析,可以确定待分析系统的数据血缘关系,这样,从待分析系统的程序代码入手,基于字节码信息和抽象语法树分析待分析系统中各业务之间的数据血缘关系,充分利用了待分析系统内部各业务之间的逻辑关系,提高了数据的血缘关系准确性。
实施例三
以上为本说明书实施例提供的数据血缘关系的处理方法,基于同样的思路,本说明书实施例还提供一种数据血缘关系的处理装置,如图7所示。
所述数据血缘关系的处理装置包括:信息确定模块601、函数语句获取模块602和数据血缘分析模块603,其中:
信息确定模块601,用于根据待分析系统中字节码文件包含的字节码信息确定所述待分析系统中类文件的抽象语法树信息;
函数语句获取模块602,用于基于所述抽象语法树信息获取所述待分析系统中的函数语句;
数据血缘分析模块603,用于对所述函数语句进行数据血缘分析,确定所述待分析系统的数据血缘关系。
本说明书实施例中,所述信息确定模块601,包括:
文件获取单元,用于获取所述待分析系统中的字节码文件;
信息提取单元,用于提取所述字节码文件中包含的关键属性信息;
类图生成单元,用于根据所述关键属性信息生成所述待分析系统的类图,以及所述类图对应的类文件的索引信息;
类文件获取单元,用于根据所述类图及所述类图对应的类文件的索引信息,获取相应的类文件;
信息处理单元,用于基于获取的类文件生成对应的类的抽象语法树信息,加载每个类的抽象语法树信息建立抽象语法树的索引信息。
本说明书实施例中,所述数据血缘分析模块603,用于将所述函数语句拆分为原子语句,并基于所述原子语句,确定所述待分析系统的数据血缘关系。
本说明书实施例中,所述数据血缘分析模块603,用于根据预设的分析模型,将所述原子语句输入到所述分析模型中进行血缘推演分析,得到所述待分析系统的数据血缘关系。
本说明书实施例中,所述数据血缘分析模块603,包括:
参数获取单元,用于获取所述原子语句中的函数参数;
血缘分析单元,用于包括如果所述函数参数为表征函数调用的相关参数,则对所述原子语句进行血缘分析,确定所述待分析系统的数据血缘关系。
本说明书实施例中,所述装置还包括:
类型信息提取模块,用于如果所述函数参数不是表征函数调用的相关参数,则获取所述函数参数所表征的相关调用的调用对象标识及调用方法标识,及从所述原子语句中的预定函数变量或所述原子语句所属的类的属性信息中提取所述函数参数的类型信息;
分析节点查询模块,用于根据所述调用对象标识、调用方法标识和所述类型信息,查询所述原子语句对应函数语句在所述抽象语法树的分析节点;
血缘信息获取模块,用于如果所述对应的函数在所述抽象语法树存在分析节点,则获取所述待分析系统当前的血缘信息;
更新模块,用于使用所述待分析系统当前的血缘信息初始化所述分析节点,得到分析后的血缘信息,以更新当前的血缘信息。
本说明书实施例中,所述装置还包括:
所述数据血缘分析模块,用于如果所述原子语句对应的函数语句在所述抽象语法树不存在分析节点,且所述原子语句为语言系统类库的调用语句,则将相应的属性的血缘关系添加到对应的对象的血缘关系中;
如果所述原子语句对应的函数语句在所述抽象语法树不存在分析节点,且所述原子语句不是语言系统类库的调用语句,则将操作数据库的血缘信息添加到当前的血缘信息中。
本说明书实施例中,所述原子语句包括赋值语句、表达式语句和返回return语句。
本说明书实施例提供一种数据血缘关系的处理装置,通过待分析系统中字节码文件包含的字节码信息确定待分析系统中类文件的抽象语法树信息,进而基于该抽象语法树信息获取待分析系统中的函数语句,通过对该函数语句进行数据血缘分析,可以确定待分析系统的数据血缘关系,这样,从待分析系统的程序代码入手,基于字节码信息和抽象语法树分析待分析系统中各业务之间的数据血缘关系,充分利用了待分析系统内部各业务之间的逻辑关系,提高了数据的血缘关系准确性。
实施例四
基于同样的思路,本说明书实施例还提供一种数据血缘关系的处理设备,如图8所示。
该数据血缘关系的处理设备可以为上述实施例提供的服务器等。
数据血缘关系的处理设备可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上的处理器701和存储器702,存储器702中可以存储有一个或一个以上存储应用程序或数据。其中,存储器702可以是短暂存储或持久存储。存储在存储器702的应用程序可以包括一个或一个以上模块(图示未示出),每个模块可以包括对数据血缘关系的处理设备中的一系列计算机可执行指令。更进一步地,处理器701可以设置为与存储器702通信,在数据血缘关系的处理设备上执行存储器702中的一系列计算机可执行指令。数据血缘关系的处理设备还可以包括一个或一个以上电源703,一个或一个以上有线或无线网络接口704,一个或一个以上输入输出接口705,一个或一个以上键盘706。
具体在本实施例中,数据血缘关系的处理设备包括有存储器,以及一个或一个以上的程序,其中一个或者一个以上程序存储于存储器中,且一个或者一个以上程序可以包括一个或一个以上模块,且每个模块可以包括对数据血缘关系的处理设备中的一系列计算机可执行指令,且经配置以由一个或者一个以上处理器执行该一个或者一个以上程序包含用于进行以下计算机可执行指令:
根据待分析系统中字节码文件包含的字节码信息确定所述待分析系统中类文件的抽象语法树信息;
基于所述抽象语法树信息获取所述待分析系统中的函数语句;
对所述函数语句进行数据血缘分析,确定所述待分析系统的数据血缘关系。
可选地,所述可执行指令在被执行时,还可以使所述处理器:
获取所述待分析系统中的字节码文件;
提取所述字节码文件中包含的关键属性信息;
根据所述关键属性信息生成所述待分析系统的类图,以及所述类图对应的类文件的索引信息;
根据所述类图及所述类图对应的类文件的索引信息,获取相应的类文件;
基于获取的类文件生成对应的类的抽象语法树信息,加载每个类的抽象语法树信息建立抽象语法树的索引信息。
可选地,所述可执行指令在被执行时,还可以使所述处理器:
将所述函数语句拆分为原子语句,并基于所述原子语句,确定所述待分析系统的数据血缘关系。
可选地,所述可执行指令在被执行时,还可以使所述处理器:
根据预设的分析模型,将所述原子语句输入到所述分析模型中进行血缘推演分析,得到所述待分析系统的数据血缘关系。
可选地,所述可执行指令在被执行时,还可以使所述处理器:
获取所述原子语句中的函数参数;
如果所述函数参数为表征函数调用的相关参数,则对所述原子语句进行血缘分析,确定所述待分析系统的数据血缘关系。
可选地,所述可执行指令在被执行时,还可以使所述处理器:
如果所述函数参数不是表征函数调用的相关参数,则获取所述函数参数所表征的相关调用的调用对象标识及调用方法标识,及从所述原子语句中的预定函数变量或所述原子语句所属的类的属性信息中提取所述函数参数的类型信息;
根据所述调用对象标识、调用方法标识和所述类型信息,查询所述原子语句对应函数语句在所述抽象语法树的分析节点;
如果所述对应的函数在所述抽象语法树存在分析节点,则获取所述待分析系统当前的血缘信息;
使用所述待分析系统当前的血缘信息初始化所述分析节点,得到分析后的血缘信息,以更新当前的血缘信息。
可选地,所述可执行指令在被执行时,还可以使所述处理器:
如果所述原子语句对应的函数语句在所述抽象语法树不存在分析节点,且所述原子语句为语言系统类库的调用语句,则将相应的属性的血缘关系添加到对应的对象的血缘关系中;
如果所述原子语句对应的函数语句在所述抽象语法树不存在分析节点,且所述原子语句不是语言系统类库的调用语句,则将操作数据库的血缘信息添加到当前的血缘信息中。
可选地,所述原子语句包括赋值语句、表达式语句和返回return语句。
本说明书实施例提供一种数据血缘关系的处理设备,通过待分析系统中字节码文件包含的字节码信息确定待分析系统中类文件的抽象语法树信息,进而基于该抽象语法树信息获取待分析系统中的函数语句,通过对该函数语句进行数据血缘分析,可以确定待分析系统的数据血缘关系,这样,从待分析系统的程序代码入手,基于字节码信息和抽象语法树分析待分析系统中各业务之间的数据血缘关系,充分利用了待分析系统内部各业务之间的逻辑关系,提高了数据的血缘关系准确性。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本说明书的实施例可提供为方法、系统、或计算机程序产品。因此,本说明书可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本说明书可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书是参照根据本说明书实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本说明书的实施例可提供为方法、系统或计算机程序产品。因此,本说明书可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本说明书的实施例而已,并不用于限制本说明书。对于本领域技术人员来说,本说明书可以有各种更改和变化。凡在本说明书的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本说明书的权利要求范围之内。