一种代码分析方法及终端设备与流程

文档序号:13282061阅读:183来源:国知局
一种代码分析方法及终端设备与流程

本发明属于计算机技术领域,尤其涉及一种代码分析方法及终端设备。



背景技术:

随着软件系统的不断地向着复杂化的方向发展,一般的软件系统的代码量也越来越大,很难直观的了解到该软件系统代码的调用关系,在对代码进行修改维护以及测试时,通常需要借助于代码的调用关系图来辅助相关技术人员进行理解,但目前一般由开发人员对调用关系进行手工梳理,效率低下且错误率高。



技术实现要素:

有鉴于此,本发明实施例提供了一种代码分析方法及终端设备,以解决现有的由开发人员对调用关系进行手工梳理,效率低下且错误率高的问题。

本发明实施例的第一方面提供了一种代码分析方法,可以包括:

获取目标java工程的源文件的绝对路径;

从所述绝对路径下的类文件中查找出与指定的url对应的第一方法;

在所述第一方法的方法体中查找对第二方法的调用,所述第二方法为与所述第一方法不同的方法;

若在所述第一方法的方法体中查找到对所述第二方法的调用,且在类文件中查找到所述第二方法,则记录所述第一方法与所述第二方法的调用关系;

在所述第二方法的方法体中查找对第三方法的调用,所述第三方法为与所述第一、第二方法不同的方法;

若在所述第二方法的方法体中查找到对所述第三方法的调用,且在类文件中查找到所述第三方法,则记录所述第二方法与所述第三方法的调用关系;

重复上述流程,直到当前方法中无法找到对新方法的调用时,则结束代码分析,并汇总记录的所述调用关系;

根据汇总的所述调用关系绘制出对应的调用关系图。

本发明实施例的第二方面提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如下步骤:

获取目标java工程的源文件的绝对路径;

从所述绝对路径下的类文件中查找出与指定的url对应的第一方法;

在所述第一方法的方法体中查找对第二方法的调用,所述第二方法为与所述第一方法不同的方法;

若在所述第一方法的方法体中查找到对所述第二方法的调用,且在类文件中查找到所述第二方法,则记录所述第一方法与所述第二方法的调用关系;

在所述第二方法的方法体中查找对第三方法的调用,所述第三方法为与所述第一、第二方法不同的方法;

若在所述第二方法的方法体中查找到对所述第三方法的调用,且在类文件中查找到所述第三方法,则记录所述第二方法与所述第三方法的调用关系;

重复上述流程,直到当前方法中无法找到对新方法的调用时,则结束代码分析,并汇总记录的所述调用关系;

根据汇总的所述调用关系绘制出对应的调用关系图。

本发明实施例的第三方面提供了一种代码分析终端设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如下步骤:

获取目标java工程的源文件的绝对路径;

从所述绝对路径下的类文件中查找出与指定的url对应的第一方法;

在所述第一方法的方法体中查找对第二方法的调用,所述第二方法为与所述第一方法不同的方法;

若在所述第一方法的方法体中查找到对所述第二方法的调用,且在类文件中查找到所述第二方法,则记录所述第一方法与所述第二方法的调用关系;

在所述第二方法的方法体中查找对第三方法的调用,所述第三方法为与所述第一、第二方法不同的方法;

若在所述第二方法的方法体中查找到对所述第三方法的调用,且在类文件中查找到所述第三方法,则记录所述第二方法与所述第三方法的调用关系;

重复上述流程,直到当前方法中无法找到对新方法的调用时,则结束代码分析,并汇总记录的所述调用关系;

根据汇总的所述调用关系绘制出对应的调用关系图。

本发明实施例与现有技术相比存在的有益效果是:本发明实施例首先获取目标java工程的源文件的绝对路径,并从所述绝对路径下的类文件中查找出与指定的url对应的第一方法,然后通过递归,一层层地查找出对下一级方法的调用,直至不存在下一级方法为止,最后将记录的所有调用关系进行汇总并绘制出对应的调用关系图。开发人员仅需指定需要进行分析的url,即可自动完成调用关系的分析并绘制出调用关系图,极大提高了分析效率,而且规避了人为失误的发生,有效降低了错误率。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例中一种代码分析方法的一个实施例流程图;

图2为本发明实施例中一种代码分析方法的根据脚本模板生成绘制脚本的示意图;

图3为本发明实施例中一种代码分析方法所生成的调用关系图的效果示意;

图4为本发明实施例提供的代码分析终端设备的示意框图;

图5为本发明实施例提供的代码分析程序的功能模块图。

具体实施方式

为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本发明一部分实施例,而非全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

本方面实施例主要是对java代码进行分析并生成调用关系图,在叙述过程中,涉及了许多与java代码相关的专业术语,为了便于理解,在此首先对这些专业术语进行简单的解释。

绝对路径:完整的描述文件位置的路径就是绝对路径,也就是从树型目录结构顶部的根目录开始到某个目录或文件的路径,由一系列连续的目录组成,中间用斜线分隔,直到要指定的目录或文件,路径中的最后一个名称即为要指向的目录或文件,例如c:\windows\system32\cmd.exe。与之对应的,相对路径是从当前路径开始的路径,如当前路径为c:\windows,使用相对路径描述上述路径应为.\system32\cmd.exe。

url:uniformresourcelocator,即统一资源定位符。url是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。

方法:在java代码中,方法是一组为了实现特定功能的代码块的集合,其作用类似于c代码中的函数。

类:在java代码中,类(class)是具有相同特性和行为的对象集合,通俗的说,类就是创建java对象的模板。对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。

数据库操作类:系统提供的对数据库进行操作的类,可以访问各种不同类型的数据库,进行建立数据库连接、执行sql语句进行数据的存取操作等。

plantuml:plantuml是一个快速创建统一建模语言(unifiedmodelinglanguage,uml)图形的组件,其中uml是面向对象软件开发中的一种通用、统一的图形模型语言,是用于软件系统规约化、可视化构造和建模的有效工具。

请参阅图1,本发明实施例中一种代码分析方法的一个实施例可以包括:

步骤s101,获取目标java工程的源文件的绝对路径。

首先,获取所述目标java工程的环境变量,也即classpath。

在java中,classpath的作用,在于告诉java执行环境,在哪些目录下可以找到所要执行的java程序所需要的类或者包。这里可以将java执行环境与操作系统进行类比,如果设置路径变量是为了让操作系统找到指定的工具程序(以windows来说就是找到.exe文件),那么设置classpath的目的就是让java执行环境找到指定的java程序(也就是.class文件)。

然后,从所述环境变量中解析出源码路径和编译路径。

在所述classpath中,提供了java代码路径、class文件路径以及jar包文件路径等源码路径,还提供了java代码的编译路径,此处需要从中解析出这些路径信息。

最后,根据所述源码路径和所述编译路径确定出所述目标java工程的源文件的绝对路径。

优选地,在本实施例中,将所述绝对路径下的类文件通过classloader加载到虚拟机内存中,以备后续查找使用。所述classloader为类加载器,用来加载java类到java虚拟机中。与普通程序不同,java程序的类文件并不是本地的可执行程序。当运行java程序时,首先运行java虚拟机,然后再把类文件加载到虚拟机里运行。

步骤s102,从所述绝对路径下的类文件中查找出与指定的url对应的第一方法。

用户可以预先输入一个或多个url,本实施中可以同时对多个url进行处理并生成对应的多个调用关系图,为了简便起见,以下均以一个url来进行说明,多个url的情况据此类推即可。

例如,若所述指定的url为:/do/pabr/pabrbasesetcontroller,则可在所述绝对路径下的类文件pabrbasesetcontroller.java中查找出对应的方法,也即所述第一方法:pabrbasesetcontroller。

步骤s103,在所述第一方法的方法体中查找对第二方法的调用。

所述第二方法为与所述第一方法不同的方法,优选地,所述第二方法为由@autowired标注的spring注入属性的方法。若在所述第一方法的方法体中查找到对所述第二方法的调用,则执行步骤s104至步骤s106,若在所述第一方法的方法体中未查找到对所述第二方法的调用,则执行步骤s107。

步骤s104,在类文件中查找所述第二方法。

具体地,首先确定与所述第二方法的方法名对应的类文件的文件路径,然后获取所述文件路径下的类文件,最后在所述类文件中查找所述第二方法。

步骤s105,记录所述第一方法与所述第二方法的调用关系。

步骤s106,将所述第二方法确定为新的第一方法。

在确定出了新的第一方法后,则需要返回执行步骤s103,也即在新的第一方法的方法体中查找到第二方法的调用。容易理解地,这是一个递归的过程,即一层层地查找出对下一级方法的调用。

例如,首先在第一方法pabrbasesetcontroller的方法体中查找对新方法的调用,若在第一方法pabrbasesetcontroller的方法体中查找到对第二方法pabrbasesetwsa的调用,则首先确定与其对应的类文件的文件路径,然后获取到该路径下的类文件pabrbasesetwsa.java,最后在所述类文件中查找到第二方法pabrbasesetwsa,记录下第一方法pabrbasesetcontroller调用了第二方法pabrbasesetwsa。

然后在第二方法pabrbasesetwsa的方法体中查找对新方法的调用,若在第二方法pabrbasesetwsa的方法体中可以查找到对第三方法pabrbasesetservice的调用,则首先确定与第三方法的方法名对应的类文件的文件路径,然后获取到该路径下的类文件pabrbasesetservice.java,最后在所述类文件中查找到所述第三方法pabrbasesetservice,记录下第二方法pabrbasesetwsa调用了第三方法pabrbasesetservice。

继续进行递归过程,在第三方法pabrbasesetservice方法体中查找对新方法的调用,若在第三方法pabrbasesetservice的方法体中可以查找到对第四方法pabrbasesetdao的调用,则首先确定与第四方法的方法名对应的类文件的文件路径,然后获取到该路径下的类文件pabrbasesetdao.java,最后在所述类文件中查找到所述第四方法pabrbasesetdao。记录下第三方法pabrbasesetservice调用了第四方法pabrbasesetdao。

重复上述流程,直到当前方法中无法找到对新方法的调用为止。

优选地,在执行步骤s107之前,还可以包括:

若当前方法所属的类为框架提供的数据库操作类的子类,则在当前方法的方法体中查找对字符串类型的参数的调用;

若在当前方法的方法体中查找到对字符串类型的参数的调用,则将所述字符串类型的参数确定为与当前方法对应的数据库标识。

例如,若在当前方法pabrbasesetdao的方法体中未查找到对新方法的调用,但当前方法pabrbasesetdao所属的类为框架提供的数据库操作类的子类,则在当前方法pabrbasesetdao的方法体中查找对字符串类型的参数的调用,若在其方法体中查找到对字符串类型的参数“getpabrcriticalissuelist”的调用,则可确定当前方法pabrbasesetdao对应的数据库标识,也即sqlid为“getpabrcriticalissuelist”。

步骤s107,结束代码分析,并汇总记录的所述调用关系。

例如,在上述的例子中,可以汇总出以下调用关系:

方法pabrbasesetcontroller调用了方法pabrbasesetwsa;

方法pabrbasesetwsa调用了方法pabrbasesetservice;

方法pabrbasesetservice调用了方法pabrbasesetdao;

以及方法pabrbasesetdao对应的sqlid为“getpabrcriticalissuelist”。

其中,pabrbasesetcontroller为网络层的方法,pabrbasesetwsa和pabrbasesetservice为应用层的方法,而pabrbasesetdao为对应的数据库层的方法,可见汇总后的调用关系的顺序依次为网络层(web层)、应用层(app层)以及数据库层。

步骤s108,根据汇总的所述调用关系绘制出对应的调用关系图。

首先,将汇总的所述调用关系导入到预设的plantuml脚本模板中,生成所述调用关系图的绘制脚本;

然后,运行所述绘制脚本,生成与汇总的所述调用关系对应的所述调用关系图。

需要注意的是,现有技术中在使用plantuml进行图形绘制时,一般都是人工编写脚本的,对每一个图形,都要编写对应的plantuml脚本,这种方式显然费时费力,且容易出错。

在本实施例中,采用了一种新的脚本编写方式,即预先设置一个通用的用于绘制调用关系图的plantuml脚本模板,该脚本模板从形式上来看与普通的绘制调用关系图的plantuml脚本无异,但空出了填写每个具体调用关系的脚本位置,对这些填写调用关系的脚本的位置进行记录并对其进行编号,例如,将其分别记为:脚本位置1、脚本位置2、脚本位置3、脚本位置4等等,这些脚本位置的个数可以根据实际情况来定,保证其可以容纳代码中完整的调用关系。例如,若已知某java代码的调用关系都在10层以内,则可以将脚本位置的个数设置为10。

然后,将在步骤s107中汇总得到的调用关系也进行编号,例如,调用关系1为pabrbasesetcontroller--|>pabrbasesetwsa(即方法pabrbasesetcontroller调用了方法pabrbasesetwsa),调用关系2为pabrbasesetwsa--|>pabrbasesetservice(即方法pabrbasesetwsa调用了方法pabrbasesetservice),调用关系3为pabrbasesetservice--|>pabrbasesetdao(即方法pabrbasesetservice调用了方法pabrbasesetdao),调用关系4为pabrbasesetdao--|>sqlid:getpabrcriticalissuelist(即方法pabrbasesetdao对应的sqlid为“getpabrcriticalissuelist”)。

最后,如图2所示,将这些调用关系分别填入对应的脚本位置中,即将调用关系1的脚本pabrbasesetcontroller--|>pabrbasesetwsa填入脚本位置1中,将调用关系2的脚本pabrbasesetwsa--|>pabrbasesetservice填入脚本位置2中,以此类推,直至将所有的调用关系脚本均填入到对应的脚本位置中,剔除掉脚本模板中剩余的脚本位置,即可得到所述调用关系图的绘制脚本,运行该绘制脚本,就可以生成所述调用关系图。

如图3所示,即为根据预置的一种脚本模板生成的一种调用关系图,需要注意的是,通过使用不同的脚本模板可以生成不同呈现方式的调用关系图,图3仅为其中的一种效果示意。用户可以根据实际情况选择合适的脚本模板,本实施例对此不作具体限定。

以上叙述均为以对一个url进行处理来进行说明,若用户预先输入了多个url,则可以分别对多个url进行并行或者串行处理并生成对应的多个调用关系图,具体过程与以上叙述相同,根据以上过程类推即可。

综上所述,本发明实施例首先获取目标java工程的源文件的绝对路径,并从所述绝对路径下的类文件中查找出与指定的url对应的第一方法,然后通过递归,一层层地查找出对下一级方法的调用,直至不存在下一级方法为止,最后将记录的所有调用关系进行汇总并绘制出对应的调用关系图。开发人员仅需指定需要进行分析的url,即可自动完成调用关系的分析并绘制出调用关系图,极大提高了分析效率,而且规避了人为失误的发生,有效降低了错误率。应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。

对应于上文实施例所述的代码分析方法,图4示出了本发明实施例提供的代码分析终端设备的示意框图,为了便于说明,仅示出了与本发明实施例相关的部分。

在本实施例中,所述代码分析终端设备可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。该代码分析终端设备可包括:处理器40、存储器41以及存储在所述存储器41中并可在所述处理器40上运行的计算机程序42。

所述处理器40可以是中央处理单元(centralprocessingunit,cpu),还可以是其他通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列(field-programmablegatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。

所述存储器41可以是所述代码分析终端设备4的内部存储单元,例如代码分析终端设备4的硬盘或内存。所述存储器41也可以是所述代码分析终端设备4的外部存储设备,例如所述代码分析终端设备4上配备的插接式硬盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)等。进一步地,所述存储器41还可以既包括所述代码分析终端设备4的内部存储单元也包括外部存储设备。所述存储器41用于存储所述计算机程序以及所述代码分析终端设备4所需的其它程序和数据。所述存储器41还可以用于暂时地存储已经输出或者将要输出的数据。

请参阅图5,是本发明实施例提供的计算机程序42的功能模块图。在本实施例中,所述的计算机程序42可以被分割成一个或多个模块,所述一个或者多个模块被存储于所述存储器41中,并由所述处理器40所执行,以完成本发明。例如,在图5中,所述的计算机程序42可以被分割成路径获取模块501、第一方法查找模块502、调用查找模块503、第二方法查找模块504、调用关系记录模块505、第一方法更新模块506、调用关系汇总模块507和调用关系图绘制模块508。本发明所称的模块是指能够完成特定功能的一系列计算机程序指令段,比程序更适合于描述所述计算机程序42在所述代码分析终端设备中的执行过程。以下描述将具体介绍所述模块501-508的功能。

路径获取模块501,用于获取目标java工程的源文件的绝对路径;

第一方法查找模块502,用于从所述绝对路径下的类文件中查找出与指定的url对应的第一方法;

调用查找模块503,用于在所述第一方法的方法体中查找对第二方法的调用,所述第二方法为与所述第一方法不同的方法;

第二方法查找模块504,用于若在所述第一方法的方法体中查找到对所述第二方法的调用,则在类文件中查找所述第二方法;

调用关系记录模块505,用于若在类文件中查找到所述第二方法,则记录所述第一方法与所述第二方法的调用关系;

第一方法更新模块506,用于将所述第二方法确定为新的第一方法,并返回执行所述在所述第一方法的方法体中查找对第二方法的调用的步骤;

调用关系汇总模块507,用于若在所述第一方法的方法体中未查找到对所述第二方法的调用,则结束代码分析,并汇总记录的所述调用关系;

调用关系图绘制模块508,用于根据汇总的所述调用关系绘制出对应的调用关系图。

进一步地,所述路径获取模块501可以包括:

环境变量获取单元,用于获取所述目标java工程的环境变量;

解析单元,用于从所述环境变量中解析出源码路径和编译路径;

绝对路径确定单元,用于根据所述源码路径和所述编译路径确定出所述目标java工程的源文件的绝对路径。

进一步地,所述第二方法查找模块504可以包括:

文件路径确定单元,用于确定与所述第二方法的方法名对应的类文件的文件路径;

类文件获取单元,用于获取所述文件路径下的类文件;

第二方法查找单元,用于在所述类文件中查找所述第二方法。

进一步地,所述调用关系图绘制模块508可以包括:

绘制脚本生成单元,用于将汇总的所述调用关系导入到预设的plantuml脚本模板中,生成所述调用关系图的绘制脚本;

调用关系图生成单元,用于运行所述绘制脚本,生成与汇总的所述调用关系对应的所述调用关系图。

进一步地,所述计算机程序42中还可以包括:

参数调用查找模块,用于若所述第一方法所属的类为框架提供的数据库操作类的子类,则在所述第一方法的方法体中查找对字符串类型的参数的调用;

数据库标识确定模块,用于若在所述第一方法的方法体中查找到对字符串类型的参数的调用,则将所述字符串类型的参数确定为与所述第一方法对应的数据库标识。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各实施例的模块、单元和/或方法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1