CN112214219B - 一种组件处理方法、装置、服务器及存储介质 - Google Patents

一种组件处理方法、装置、服务器及存储介质 Download PDF

Info

Publication number
CN112214219B
CN112214219B CN201910550779.7A CN201910550779A CN112214219B CN 112214219 B CN112214219 B CN 112214219B CN 201910550779 A CN201910550779 A CN 201910550779A CN 112214219 B CN112214219 B CN 112214219B
Authority
CN
China
Prior art keywords
components
component
annotation
code
dependency
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201910550779.7A
Other languages
English (en)
Other versions
CN112214219A (zh
Inventor
方旭楷
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201910550779.7A priority Critical patent/CN112214219B/zh
Publication of CN112214219A publication Critical patent/CN112214219A/zh
Application granted granted Critical
Publication of CN112214219B publication Critical patent/CN112214219B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • G06F9/44526Plug-ins; Add-ons
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02PCLIMATE CHANGE MITIGATION TECHNOLOGIES IN THE PRODUCTION OR PROCESSING OF GOODS
    • Y02P90/00Enabling technologies with a potential contribution to greenhouse gas [GHG] emissions mitigation
    • Y02P90/30Computing systems specially adapted for manufacturing

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本申请公开了一种组件处理方法、装置、服务器及存储介质,在方法中在包含多个组件的项目代码中预先编写各组件的注解代码,进而在注解代码经过解析之后能够得到包含组件间依赖关系信息的注解配置信息,而在组件间依赖关系的基础上就可以生成包含组件之间的注册逻辑信息的注册文件,无需开发人员手工对组件进行排序,因此,在对项目代码中的多个组件进行注册时,可以基于注册文件中的注册逻辑信息依次对各组件完成注册,避免手工对组件进行排序导致排序不准确而使得组件注册失败的情况,由此,本申请中能够通过在项目代码中编写注解代码来实现组件的顺利注册,从而提高组件注册的可靠性。

Description

一种组件处理方法、装置、服务器及存储介质
技术领域
本申请涉及软件开发技术领域,尤其涉及一种组件处理方法、装置、服务器及存储介质。
背景技术
为了解耦复杂的软件系统,通常将系统中多个功能模块进行拆分,得到互相独立的各种应用服务组件,这些应用服务组件在注册之后,可以通过中间的路由器来实现组件调用,由此提供相应的组件服务。
而在实际应用中,组件之间可能存在依赖关系,如组件A依赖于组件B的功能服务,那么在初始化组件A之前,需要先注册并初始化组件B的服务,才能保证组件A在组件B的基础上正常初始化。
目前,在对组件进行注册时,通常是由开发人员手工对组件进行排序,并以人工排序的组件顺序对组件进行注册,因此可能会出现排序不准确而导致组件最终注册失败的情况。
发明内容
有鉴于此,本申请提供一种组件处理方法、装置、服务器及存储介质,以在对组件进行注册时,能够提高组件注册的可靠性。
为实现上述目的,一方面,本申请提供了一种组件处理方法,所述方法包括:
获得项目代码,所述项目代码中包括多个组件的代码;
对所述项目代码中所述组件的注解代码进行解析,以得到注解配置信息,所述注解配置信息中至少包括:组件间依赖关系信息;
基于所述组件间依赖关系信息,生成所述项目代码的注册文件,所述注册文件中至少包括所述多个组件中组件之间的注册逻辑信息;
基于所述注册文件中的注册逻辑信息,对所述多个组件中的各组件进行注册。
可选的,所述基于所述注册文件中的注册逻辑信息,对所述多个组件中的各组件进行注册,包括:
在对所述多个组件中的各组件进行注册时,加载所述注册文件,以使得所述多个组件中的各组件按照所述注册文件中的注册逻辑信息依次进行注册。
在一种可能的实现方式中,所述基于所述组件间依赖关系信息,生成所述项目代码的注册文件,包括:
对所述组件间依赖关系信息进行解析,以生成所述多个组件中各组件间的依赖树图;
基于所述依赖树图,生成所述项目代码的注册文件。
可选的,所述基于所述依赖树图,生成所述项目代码的注册文件,包括:
在所述依赖树图为有向无环图的情况下,基于所述依赖树图生成依赖数组;
利用所述依赖数组,生成所述项目代码的注册文件,所述注册文件中至少包括所述多个组件中组件之间的注册逻辑信息。
可选的,所述基于所述依赖树图生成依赖数组,包括:
利用拓扑排序算法,对所述依赖树图进行解析,以生成依赖数组,所述依赖数组表征所述多个组件中组件之间的依赖关系。
在又一种可能的实现方式中,所述注解配置信息中还包括:组件注入信息;其中,所述方法还包括:
基于所述组件注入信息,在所述项目代码中筛选出包含注入类的目标组件;
在所述目标组件中注入目标代码,所述目标代码用于调用所述目标组件中所需插入的组件,所述目标代码中至少包括所述目标组件中所需插入的组件的名称。
可选的,所述基于所述组件注入信息,在所述项目代码中筛选出包含注入类的目标组件,包括:
基于所述组件注入信息,利用javassist在项目代码中筛选出包含注入类的目标组件。
在另一种可能的实现方式中,所述对所述项目代码中所述组件的注解代码进行解析,以得到注解配置信息,包括:
利用注解处理器,在所述项目代码中读取所述组件的注解代码并对所述注解代码进行解析,以得到注解配置信息,所述注解配置信息中至少包括:所述多个组件的组件间依赖关系信息。
又一方面,本申请还提供了一种组件处理装置,包括:
代码获得单元,用于获得项目代码,所述项目代码包括多个组件的代码;
注解解析单元,用于对所述项目代码中所述组件的注解代码进行解析,以得到注解配置信息,所述注解配置信息中至少包括:组件间依赖关系信息;
文件生成单元,用于基于所述组件间依赖关系信息,生成所述项目代码的注册文件,所述注册文件中至少包括所述多个组件中组件之间的注册逻辑信息;
逻辑注册单元,用于基于所述注册文件中的注册逻辑信息,对所述多个组件中的各组件进行注册。
在一种可能的实现方式中,所述文件生成单元包括:
配置解析子单元,用于对所述组件间依赖关系信息进行解析,以生成所述多个组件中各组件间的依赖树图;
数组生成子单元,用于在所述依赖树图为有向无环图的情况下,基于所述依赖树图生成依赖数组;
逻辑生成子单元,用于利用所述依赖数组,生成所述项目代码的注册文件,所述注册文件中至少包括所述多个组件中组件间的注册逻辑信息。
在另一种可能的实现方式中,所述装置还包括:
组件注入单元,用于基于所述注解配置信息中的组件注入信息,在所述项目代码中筛选出包含注入类的目标组件,在所述目标组件中注入目标代码,所述目标代码用于调用所述目标组件中所需插入的组件,所述目标代码中至少包括所述目标组件中所需插入的组件的名称。
又一方面,本申请还提供了服务器,包括:
处理器和存储器;
其中,所述处理器用于执行所述存储器中存储的程序;
所述存储器用于存储程序,所述程序至少用于:
获得项目代码,所述项目代码中包括多个组件的代码;
对所述项目代码中所述组件的注解代码进行解析,以得到注解配置信息,所述注解配置信息中至少包括:组件间依赖关系信息;
基于所述组件间依赖关系信息,生成所述项目代码的注册文件,所述注册文件中至少包括所述多个组件中组件之间的注册逻辑信息;
基于所述注册文件中的注册逻辑信息,对所述多个组件中的各组件进行注册。
又一方面,本申请还提供了一种存储介质,所述存储介质中存储有计算机可执行指令,所述计算机可执行指令被处理器加载并执行时,实现如上任一项所述的组件处理方法。
从上述技术方案可以看出,本申请中在包含多个组件的项目代码中预先编写各组件的注解代码,进而在注解代码经过解析之后能够得到包含组件间依赖关系信息的注解配置信息,而在组件间依赖关系的基础上就可以生成包含组件之间的注册逻辑信息的注册文件,无需开发人员手工对组件进行排序,因此,在对项目代码中的多个组件进行注册时,可以基于注册文件中的注册逻辑信息依次对各组件完成注册,避免手工对组件进行排序导致排序不准确而使得组件注册失败的情况,由此,本申请中能够通过在项目代码中编写注解代码来实现组件的顺利注册,从而提高组件注册的可靠性。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示出了本申请实施例的一种组件处理系统的组成框架示意图;
图2示出了本申请实施例的一种服务器的逻辑架构示意图;
图3示出了本申请实施例的一种组件处理方法一种流程示意图;
图4示出了本申请实施例的一种组件处理方法另一种流程示意图;
图5及图6分别示出了本申请实施例中组件注册与注入的的一示例图;
图7示出了本申请实施例一种组件处理装置一个实施例的组成示意图;
图8示出了本申请实施例一种组件处理装置另一个实施例的组成示意图;
图9示出了本申请实施例的一种服务器的组成结构示意图。
具体实施方式
本申请的发明人经研究发现:随着组件服务的业务膨胀,组件服务(也可以称为:类)间完全可能存在相互调用问题,这会导致组件间的初始化顺序可能存在问题。假设A依赖B的服务业务能力,那么在初始化A前,需要先注册并初始化B服务,从而保证A初始化时,能正确的拿到B。而在项目一开始组件较少时,可以通过手工的在注册时候显式的排顺序去完成组件注册,但随着添加的直接服务从几个涨到几十个甚至更多之后,其复杂的依赖关系已经无人能知晓,后续再增加组件服务,完全有可能出现排序错误甚至出现循环依赖的情况,并且很难被及时发现并解决,直接导致组件注册失败甚至项目崩溃,由此目前仍然存在组件注册的可靠性较低的情况。
而发明人进一步研究发现,为了实现组件顺利注册,需要对组件的注册顺序或注册逻辑进行准确获取,只有按照准确的组件注册逻辑才能成功顺利的将各组件依次进行注册,才能保障项目的顺利进行。基于此,可以在项目代码编写时将对其他组件的依赖关系写入到各组件的注解代码中,这样,在项目代码进行编译之前,可以先收集项目代码中的各组件的注解代码,从而解析出包含组件间依赖关系信息的注解配置信息,在此基础上生成注册文件,进而在对各组件进行注册时即可按照注册文件中的注册逻辑信息对各个组件依次进行注册,由此提高了组件注册的可靠性,保障了项目的顺利进行。
为了便于理解,本文中先对本申请的方案所适用的系统进行介绍,参考图1,其示出了本申请一种实现组件处理的系统的一种组成架构示意图。
如图1中所示,本申请实施例中实现组件处理的系统中可以包括有:服务器10和终端20。终端20与服务器10之间通过连接线或连接网络相连接。
其中,终端20可以为笔记本或电脑等终端,能够实现项目代码的编写,即开发人员可以通过终端20编写项目代码。
需要说明的是,项目代码中可以包括有多个组件的代码。其中,组件还可以具有注解代码,如以@开头的代码段,该注解代码中可以包含有以下代码内容:当前注解所属的组件的代码模块位置、组件服务接口、实现接口类、当前注解所属的组件所依赖的组件、当前注解所属的组件的服务功能、当前注解所属的组件的注入类等等。
而终端20上的项目代码在编写完成之后,可以将项目代码上传到服务器10,而服务器10可以为进行项目代码的编辑、编译、测试及运行等开发任务的服务器。
其中,服务器10在对项目代码中的组件进行处理时的功能逻辑架构参考图2中所示,服务器10在接收到终端20上传的项目代码之后,在对项目代码中的组件进行编译注册之前,首先利用注解处理器APT(Annotation Processor Tool)对项目代码中各组件的注解代码进行收集并进行解析,以得到包含有组件间依赖关系信息和组件注入信息(如需要插入的组件的插入位置和组件名称等信息)的注解配置信息,如配置文件FALCO_CONFIG,之后,可以利用脚本工具FGP(Falco Gradle Plugin)对注解配置信息进行解析,具体的,FGP首先将注解配置信息解析生成依赖树图,该依赖树图为项目代码中各组件之间的依赖树图,在此依赖树图上可以判断出组件之间是否存在循环的依赖关系,如果存在循环的依赖关系,那么及时终止当前项目代码的编译及组件的注册流程,而如果没有循环的依赖关系,即该依赖树图为有向无环图,那么FGP就可以利用拓扑排序算法如TopoSort来生成一个包含正确的依赖关系的依赖数组,之后,利用Javapoet能够生成类文件的能力,将该依赖数组生成一个包含注册逻辑信息的类文件加入到项目代码的代码目录中,与此同时,服务器10可以利用Javassist对项目代码中包含注入类如带注解变量的组件进行赋值,即在组件中插入能够调用其所需要插入的组件的代码,并移除注解之后再将项目代码利用编译器进行编译打包成安装包APK(Android Package)以实现组件注入,之后,在对项目代码进行编译时,项目代码中的组件可以通过加载包含注册逻辑信息的类文件实现对各组件的顺利注册。
以下对服务器中对组件进行注册的实现过程进行详细介绍。
如,参考图3,其示出了本申请一种组件处理方法一个实施例的流程图,本实施例中的方法可以包括以下步骤:
步骤301:获得项目代码。
其中,项目代码中包括多个组件的代码。
需要说明的是,服务器可以从开发人员编写代码的终端上获取到上传来的项目代码,或者,服务器上设置有代码编写工具,开发人员可以直接在服务器上进行代码编写,此时服务器可以直接获得开发人员编写完成的项目代码。
其中,项目代码中除了包含有各个组件的代码模块之外,还可以包含对其他组件存在依赖关系的组件所依赖的组件相关代码等,具体的,项目代码中对于对其他组件存在依赖关系的组件编写有相应的注解代码,该注解代码以@开头,其中可以包含有:当前注解所属的组件的代码模块位置key、组件服务接口interface、对应的实现接口类impl(对应于当前注解所属的组件的注入类)、当前注解所属的组件所依赖的组件dependence、当前注解所属的组件的服务功能、当前注解所属组件的所属进程等等,如下注解代码的片段:
@AutoRegisterService(key={FirstService.class},//代码模块位置
dependsClass={SecondService.class},//依赖组件
,processName={MAIN})//所属进程
可见,在组件的注解代码中写入组件所属进程的相关的内容,如在注解中添加进程名称:processName={MAIN},就可以把所需注册的组件在进程上做区分。而且,开发人员通过编写代码以自己显式的方式声明组件依赖的类,这个声明写在相应的组件代码模块内,如注解代码中的dependsClass,所以当需要增删某个组件的代码模块时,只需直接删除相应的代码模块即可,不需要去手动删除相应的组件注册语句,同时组件相对依赖关系依然能够基于注解代码保持正常。
步骤302:对项目代码中组件的注解代码进行解析,以得到注解配置信息。
其中,注解配置信息中至少包括有:项目代码中多个组件的组件间依赖关系信息。
需要说明的是,服务器可以利用APT对项目代码中的注解代码进行读取收集,再对注解代码进行解析,以生成注解配置信息,如配置文件FALCO_CONFIG,其中可以包含有项目代码的各组件之间的依赖关系信息,如A依赖B,B依赖C的依赖关系等,也可以包含有组件中需要插入的组件的信息,如A中需要调用D的路由信息。
步骤303:基于组件间依赖关系信息,生成项目代码的注册文件。
其中,注册文件中至少包括有多个组件中组件之间的注册逻辑信息。注册逻辑信息可以理解为:组件之间的注册顺序逻辑,如C先于B注册,B先于A注册的顺序逻辑。
需要说明的是,服务器可以利用FGP、toposort及javapoet等工具或算法的组合来对组件间依赖关系信息进行解析,由此生成项目代码的注册文件,该注册文件可以为类文件,如AppAutoRegisterService.class,该类文件中包含有项目代码中的各个组件之间的注册顺序逻辑。
步骤304:基于注册文件中的注册逻辑信息,对多个组件中的各组件进行注册。
其中,服务器在生成注册文件之后,可以利用编译器在对项目代码的编译后,调用并加载注册文件,如加载AppAutoRegisterService.class,从而按照其中的注册逻辑信息,如C先于B注册及B先于A注册的顺序逻辑,对项目代码中的各个组件依次进行注册,在组件服务平台或服务中心顺利注册各个组件,以提供给其他组件或项目进行调用,以提供相应的组件服务。
由上述方案可知,本实施例中在包含多个组件的项目代码中预先编写各组件的注解代码,进而在注解代码经过解析之后能够得到包含组件间依赖关系信息的注解配置信息,而在组件间依赖关系的基础上就可以生成包含组件之间的注册逻辑信息的注册文件,无需开发人员手工对组件进行排序,因此,在对项目代码中的多个组件进行注册时,可以基于注册文件中的注册逻辑信息依次对各组件完成注册,避免手工对组件进行排序导致排序不准确而使得组件注册失败的情况,由此,本实施例中能够通过在项目代码中编写注解代码来实现组件的顺利注册,从而提高组件注册的可靠性。
同时,本实施例中通过在注解中编写组件之间的依赖关系,从而利用在编译前生成的注册文件如AppAutoServiceRegister来标记,同时开发人员通过编写代码以自己显式的声明组件依赖的类,这个声明写在相应的组件代码模块内,所以当需要增删某个组件的代码模块时,只需直接删除相应的代码模块即可,不需要去手动删除相应的注册语句,同时组件相对依赖关系依然能够基于注解代码保持正常。
在一种实现方式中,服务器中在步骤303中基于组件间依赖关系信息生成项目代码的注册文件时,具体可以通过以下方式实现:
服务器首先利用FGP对组件间依赖关系信息进行解析,以生成多个组件中各组件间的依赖树图,进而基于依赖树图来生成项目代码的注册文件,具体的,首先对这个依赖树图是否存在循环依赖关系或是否为有向无环图DAG(Directed Acyclic Graph)进行判断;
如果该依赖树图中存在循环依赖关系即不是有向无环图,那么服务器对开发人员输出报错信息并终止当前项目代码的编译,并向开发人员建议进行代码修改;
如果依赖树图中没有循环依赖关系而是一个DAG,那么可以利用拓扑排序算法如toposort算法对依赖树图生成一个表征正确的组件间依赖关系的依赖数组,接着使用Javapoet生成类文件的能力,利用该依赖数组生成项目代码的注册文件,该类文件中包含项目代码中各组件的注册逻辑,即注册顺序,如AppAutoRegisterService.class或falcoAutoRegisterService.class等类文件。
进一步可见,本实施例中在项目代码编写时在组件的注解代码中写入与其他组件的依赖关系,从而可以在项目代码编译前基于注解代码来解析出整个项目代码中各组件之间的整体依赖关系,从而编译时能够清楚整个依赖关系全貌,提前判断是否有循环依赖,避免项目运行时因为循环依赖而导致的不知名的注册中断的情况。
在一种可能的情况中,组件中可能对其他组件通过路由器进行调用,如AppRuntime.registerService(FirstService.class,FirstServiceImpl.class),即调用FirstService.class和FirstServiceImpl.class,为了避免对AppRuntime类的强引用,本实施例中在项目代码中各组件的注解代码中通过编写注解变量来实现,例如,在项目代码中可以不直接编写AppRuntime类,而是在相应组件代码模块中编写有以下代码:
@FalcoInject//注解标识
IPlayService playService;//注入类及注解变量
其中,@FalcoInject表示playService为注解变量。
基于此,服务器在生成注册文件的同时,对项目代码中包含注入类的目标组件进行筛选,并在目标组件中注入用于调用目标组件中所需插入的组件的目标代码,实现对目标组件中注解变量的赋值,以便于在后续项目代码编译时直接运行目标代码,实现对组件的路由调用,而这一过程中并不需要在项目代码的原始代码中写入目标代码如AppRuntime类,避免对路由调用代码的强应用。
具体的,服务器在进行组件注册的同时对组件进行注入操作,具体如图4中所示:
步骤401:获得项目代码。
其中,项目代码中包括多个组件的代码。
需要说明的是,服务器可以从开发人员编写代码的终端上获取到上传来的项目代码,或者,服务器上设置有代码编写工具,开发人员可以直接在服务器上进行代码编写,此时服务器可以直接获得开发人员编写完成的项目代码。
其中,项目代码中除了包含有各个组件的代码模块之外,还可以包含对其他组件存在依赖关系的组件所依赖的组件相关代码等,具体的,项目代码中对于对其他组件存在依赖关系的组件编写有相应的注解代码,该注解代码以@开头,其中可以包含有:当前注解所属的组件的代码模块位置key、组件服务接口interface、对应的实现接口类impl(对应于当前注解所属的组件的注入类)、当前注解所属的组件所依赖的组件dependence、当前注解所属的组件的服务功能、当前注解所属组件的所属进程processName等等。
可见,在组件的注解代码中写入组件所属进程的相关的内容,就可以把所需注册的组件在进程上做区分。而且,开发人员通过编写代码以自己显式的方式声明组件依赖的类,这个声明写在相应的组件代码模块内所以当需要增删某个组件的代码模块时,只需直接删除相应的代码模块即可,不需要去手动删除相应的组件注册语句,同时组件相对依赖关系依然能够基于注解代码保持正常。
步骤402:对项目代码中组件的注解代码进行解析,以得到注解配置信息。
其中,注解配置信息中至少包括有:项目代码中多个组件的组件间依赖关系信息以及组件注入信息。
需要说明的是,服务器可以利用APT对项目代码中的注解代码进行读取收集,再对注解代码进行解析,以生成注解配置信息,如配置文件FALCO_CONFIG,其中可以包含有项目代码的各组件之间的依赖关系信息,如A依赖B,B依赖C的依赖关系等,也可以包含有组件注入信息,即组件中需要插入的组件的信息,如A中需要调用D的路由信息。
步骤403:基于组件间依赖关系信息,生成项目代码的注册文件。
其中,注册文件中至少包括有多个组件中组件之间的注册逻辑信息。注册逻辑信息可以理解为:组件之间的注册顺序逻辑,如C先于B注册,B先于A注册的顺序逻辑。
具体的,服务器首先可以利用FGP对组件间依赖关系信息进行解析,以生成多个组件中各组件间的依赖树图,进而基于依赖树图来生成项目代码的注册文件,具体的,首先对这个依赖树图是否存在循环依赖关系或是否为有向无环图DAG(Directed Acyclic Graph)进行判断;
如果该依赖树图中存在循环依赖关系即不是有向无环图,那么服务器对开发人员输出报错信息并终止当前项目代码的编译,并向开发人员建议进行代码修改;
如果依赖树图中没有循环依赖关系而是一个DAG,那么可以利用拓扑排序算法如toposort算法对依赖树图生成一个表征正确的组件间依赖关系的依赖数组,接着使用Javapoet生成类文件的能力,利用该依赖数组生成项目代码的注册文件,该类文件中包含项目代码中各组件的注册逻辑,即注册顺序,如AppAutoRegisterService.class或falcoAutoRegisterService.class等类文件。基于此,本实施例中在项目代码编写时在组件的注解代码中写入与其他组件的依赖关系,从而可以在项目代码编译前基于注解代码来解析出整个项目代码中各组件之间的整体依赖关系,从而后续编译注册时能够清楚整个依赖关系全貌,提前判断是否有循环依赖,避免项目运行时因为循环依赖而导致的不知名的注册中断的情况。
步骤404:基于注解配置信息中的组件注入信息,在项目代码中筛选出包含注入类的目标组件。
例如,服务器对注解配置文件中ALCO_CONFIG里面的所有impl字段信息进行读取,利用javassist筛选出其中注入类的组件,即目标组件,该目标组件中在注入类中包含需要调用其他组件的注解变量,如目标组件中包含以@FalcoInject标记的IPlayService注入类。
步骤405:在目标组件中注入目标代码。
其中,目标代码为用于调用目标组件中所需插入的组件的代码,如调用FirstService.class的路由代码:AppRuntime.registerService(FirstService.class),该目标代码中至少包含目标组件中所需插入或调用的组件的名称,如FirstService.class。服务器在筛选出包含注入类的目标组件之后,在目标组件的代码中的注入类进行代码赋值,即将注入类赋值为目标代码,具体可以利用Javassist在目标组件中对注入类赋值为调用目标组件所需插入组件的代码。
例如,为了避免对AppRuntime.class的强引用,项目代码中可以不再需要手动编写AppRuntime.getService(xxx.class),而可以在项目代码中以注解的形式对注入类写入注解变量,如:
@FalcoInject//注解
IPlayService playService;//注入类IPlayService,注入变量playService
在对项目代码进行编译之前,基于注解配置信息中的组件注入信息,如impl字段中的接口信息,表征组件是否调用其他组件以及组件需要调用哪些组件的信息,在项目代码中利用组件注入信息筛选过滤出包含注入类的目标组件,进而对目标组件中的注解变量进行赋值,即:将调用playService.class的代码AppRuntime.getService(playService.class)赋值给playService,并删除注解,由此得到代码:
IPlayService playService=AppRuntime.getService(playService.class)。
由此,项目代码无需直接编写AppRuntime类的代码,避免强引用的情况下能够实现组件注入。
步骤406:基于注册文件中的注册逻辑信息,对多个组件中的各组件进行注册。
其中,服务器可以将经过组件注入的项目代码更新并通知到编译器,由编译器对项目代码进行编译,打包成APK之后,调用并加载包含组件的注册逻辑信息的注册文件,如加载AppAutoRegisterService.class,从而按照其中的注册逻辑信息,如C先于B注册及B先于A注册的顺序逻辑,对编译完成的各个组件依次进行注册,在组件服务平台或服务中心顺利注册各个组件,以提供给其他组件或项目进行调用,以提供相应的组件服务。
为了便于理解,以下结合服务器在图5的逻辑架构图和图6的组件注册注入流程图对本方案在实际应用中示例进行介绍:
首先,生成注解配置文件:
具体的,在项目代码编写时,将各组件的注解编写在组件对应的代码目录中,在对项目代码进行编译之前,服务器通过注解处理器APT,会生成一个对应的包含组件间依赖关系信息和需要插入的组件信息的注解配置文件,如FALCO_CONFIG。
其次,生成注册类:
具体的,服务器利用FalcoGradlePlugin在对项目代码执行JavaC的编译任务之前解析注解配置文件,以生成依赖树图,并对这个依赖树图做判断,如果树图中存在循环依赖,报错并终止编译,提醒对代码进行修改;如果是DAG就利用拓扑排序算法如TopoSort生成一个表征正确的组件间依赖关系的数组,接着利用JavaPoet能够生成类文件的能力,将这个数组生成一个包含组件间的注册逻辑信息的注册类(用于组件注册的类)如AppAutoRegisterService.class文件,并写入到项目代码的代码目录中。
同时,自动注入:
具体的,服务器在生成注册类的同时,服务器可以基于FALCO_CONFIG文件里面的注入类信息如impl字段信息,利用javassist对项目代码中的组件进行过滤,以筛选出只包含注解变量即包含注入类的组件及其代码,从而只针对含有注入类的组件做处理,从而把组件代码中加了@FalcoInject注解变量的代码位置,自动插入赋值语句,如将AppRuntime.getService(playService.class)赋值给playService,并删除playService前对应的注解代码,实现组件注入,之后,再将经过组件注入的项目代码重新传递给编译器,打包成APK。
最后,加载服务LoadAutoRegiser():
具体的,在编译器完成项目代码编译之后,对准备对组件进行注册时,利用LoadAutoRegiser()反射加载注册类如AppAutoRegisterService.class类,由此,实现完成组件的注册与注入。
可见,基于以上实现,本实施例中预先编写各组件的注解代码,进而在注解代码经过解析之后可以生成包含组件之间的注册逻辑信息的注册文件,无需开发人员手工对组件进行排序,因此,在对项目代码中的多个组件进行注册时,可以基于注册文件中的注册逻辑信息依次对各组件完成注册,避免手工对组件进行排序导致排序不准确而使得组件注册失败的情况,由此,本实施例中能够通过在项目代码中编写注解代码来实现组件的顺利注册,从而提高组件注册的可靠性。
进一步的,本实施例中可以在项目代码编译前基于注解代码来解析出整个项目代码中各组件之间的依赖树图,从而解析出整体依赖关系,从而编译时能够清楚整个依赖关系全貌,提前判断是否有循环依赖,避免项目运行时因为循环依赖而导致的运行中断的情况。
另外,本实施例中通过在注解中编写组件之间的依赖关系,从而利用在编译前生成的注册文件如AppAutoServiceRegister来标记,同时开发人员在项目代码中编写注解以自己显式的方式声明组件依赖的类,这个声明写在相应的组件代码模块内,所以当需要增删某个组件的代码模块时,只需直接删除,不需要去手动删除相应的注册语句,同时组件相对依赖关系依然保持正常。
而且为了把注册组件在进程上做区分,也可以在组件的注解代码中写入相关的内容即可,如在注解中添加进程名称:processName={MAIN}。
与此同时,本实施例中根据APT生成的含有注解类信息,对整个项目代码作为输入的集合做过滤,从而避免大海捞针操作,精准的只对有注入类如@FalcoInject或@FalcoAutoRegister等才做处理,没有就直接跳过该类文件,从而加快处理速度,提高组件注入效率。
由此,本实施例在服务器中利用APT+Javassist+FGP的联合方案,不仅能够提高组件注册和注入的可靠性,还保持处理时间为常量级别,从而提高注册和注入的效率。而且,对于旧版本的软件开发,可以通过简单的添加注解配置的方式来完成组件化的服务注册和注入,以后如果需要切换为别的方案,也不影响,从而提高适用性。
又一方面,本申请还提供了一种组件处理装置,如图7中所示,其示出了本申请一种组件处理装置一个实施例的组成示意图,本实施例的装置可以应用于服务器,该装置可以包括:
代码获得单元701,用于获得项目代码,所述项目代码包括多个组件的代码。
注解解析单元702,用于对所述项目代码中所述组件的注解代码进行解析,以得到注解配置信息,所述注解配置信息中至少包括:组件间依赖关系信息。
文件生成单元703,用于基于所述组件间依赖关系信息,生成所述项目代码的注册文件,所述注册文件中至少包括所述多个组件中组件之间的注册逻辑信息。
逻辑注册单元704,用于基于所述注册文件中的注册逻辑信息,对所述多个组件中的各组件进行注册。
在一种可能的情况中,所述文件生成单元703包括:
配置解析子单元,用于对所述组件间依赖关系信息进行解析,以生成所述多个组件中各组件间的依赖树图;
数组生成子单元,用于在所述依赖树图为有向无环图的情况下,基于所述依赖树图生成依赖数组;
逻辑生成子单元,用于利用所述依赖数组,生成所述项目代码的注册文件,所述注册文件中至少包括所述多个组件中组件间的注册逻辑信息。
可选的,注解解析单元702具体用于:
利用注解处理器,在所述项目代码中读取所述组件的注解代码并对所述注解代码进行解析,以得到注解配置信息,所述注解配置信息中至少包括:所述多个组件的组件间依赖关系信息。
可选的,逻辑注册单元704具体用于:
在对所述多个组件中的各组件进行注册时,加载所述注册文件,以使得所述多个组件中的各组件按照所述注册文件中的注册逻辑信息依次进行注册。
在一种可能的情况中,如图8中所示,本实施例中的组件处理装置中还可以包括有:
组件注入单元705,用于基于所述注解配置信息中的组件注入信息,在所述项目代码中筛选出包含注入类的目标组件,在所述目标组件中注入目标代码,所述目标代码用于调用所述目标组件中所需插入的组件,所述目标代码中至少包括所述目标组件中所需插入的组件的名称。
其中,组件注入单元705对组件进行相关组件的注入之后,重新对项目代码进行打包,再对打包的项目代码进行编译后,逻辑注册单元704基于所述注册文件中的注册逻辑信息,对所述多个组件中的各组件进行注册。
另一方面,本申请还提供了一种服务器,如图9,其示出了本申请的服务器的一种组成结构示意图,本实施例的服务器10可以包括:处理器901和存储器902,处理器901与存储器902之间可以通过通信中线903进行数据或指令的传输。
在本申请实施例中,该处理器901,可以为中央处理器(Central ProcessingUnit,CPU),特定应用集成电路,数字信号处理器、现成可编程门阵列或者其他可编程逻辑器件等。
该处理器901可以调用存储器902中存储的程序。具体的,处理器可以执行以下消息发送方法的实施例中应用服务器侧所执行的操作。
存储器902中用于存放一个或者一个以上程序,程序可以包括程序代码,所述程序代码包括计算机操作指令,在本申请实施例中,该存储器902中至少存储有用于实现以下功能的程序:
获得项目代码,所述项目代码中包括多个组件的代码;
对所述项目代码中所述组件的注解代码进行解析,以得到注解配置信息,所述注解配置信息中至少包括:组件间依赖关系信息;
基于所述组件间依赖关系信息,生成所述项目代码的注册文件,所述注册文件中至少包括所述多个组件中组件之间的注册逻辑信息;
基于所述注册文件中的注册逻辑信息,对所述多个组件中的各组件进行注册。
在一种可能的实现方式中,该存储器902可包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、以及至少一个功能(比如代码编译等)所需的应用程序等;存储数据区可存储根据计算机的使用过程中所创建的数据,比如,项目代码及打包的APK等等。
此外,存储器902可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件或其他易失性固态存储器件。
当然,图9所示的服务器的结构并不构成对本申请实施例中服务器的限定,在实际应用中终端可以包括比图9所示的更多或更少的部件,或者组合某些部件。
另一方面,本申请实施例还提供了一种存储介质,所述存储介质中存储有计算机可执行指令,所述计算机可执行指令被处理器加载并执行时,实现如上任意一个实施例中终端侧所执行的组件处理方法。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、物品或者设备中还存在另外的相同要素。
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
以上仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (11)

1.一种组件处理方法,其特征在于,所述方法包括:
获得项目代码,所述项目代码中包括多个组件的代码,所述项目代码中对于其他组件存在依赖关系的组件编写有相应的注解代码;
对所述项目代码中所述组件的注解代码进行解析,以得到注解配置信息,所述注解配置信息中至少包括:所述项目代码中多个组件的组件间依赖关系信息;
对所述组件间依赖关系信息进行解析,以生成所述多个组件中各组件间的依赖树图;
在所述依赖树图为有向无环图的情况下,利用拓扑排序算法,对所述依赖树图进行解析,以生成依赖数组,所述依赖数组表征所述多个组件中组件之间的依赖关系;
利用所述依赖数组,生成所述项目代码的注册文件,所述注册文件中至少包括所述多个组件中组件之间的注册逻辑信息;
基于所述注册文件中的注册逻辑信息,对所述多个组件中的各组件进行注册。
2.根据权利要求1所述的方法,其特征在于,所述基于所述注册文件中的注册逻辑信息,对所述多个组件中的各组件进行注册,包括:
在对所述多个组件中的各组件进行注册时,加载所述注册文件,以使得所述多个组件中的各组件按照所述注册文件中的注册逻辑信息依次进行注册。
3.根据权利要求1所述的方法,其特征在于,所述注解配置信息中还包括:组件注入信息;
其中,所述方法还包括:
基于所述组件注入信息,在所述项目代码中筛选出包含注入类的目标组件;
在所述目标组件中注入目标代码,所述目标代码用于调用所述目标组件中所需插入的组件,所述目标代码中至少包括所述目标组件中所需插入的组件的名称。
4.根据权利要求3所述的方法,其特征在于,所述基于所述组件注入信息,在所述项目代码中筛选出包含注入类的目标组件,包括:
基于所述组件注入信息,利用javassist在项目代码中筛选出包含注入类的目标组件。
5.根据权利要求1所述的方法,其特征在于,所述对所述项目代码中所述组件的注解代码进行解析,以得到注解配置信息,包括:
利用注解处理器,在所述项目代码中读取所述组件的注解代码并对所述注解代码进行解析,以得到注解配置信息,所述注解配置信息中至少包括:所述多个组件的组件间依赖关系信息。
6.一种组件处理装置,其特征在于,包括:
代码获得单元,用于获得项目代码,所述项目代码包括多个组件的代码,所述项目代码中对于其他组件存在依赖关系的组件编写有相应的注解代码;
注解解析单元,用于对所述项目代码中所述组件的注解代码进行解析,以得到注解配置信息,所述注解配置信息中至少包括:所述项目代码中多个组件的组件间依赖关系信息;
文件生成单元,用于基于所述组件间依赖关系信息,生成所述项目代码的注册文件,所述注册文件中至少包括所述多个组件中组件之间的注册逻辑信息;
逻辑注册单元,用于基于所述注册文件中的注册逻辑信息,对所述多个组件中的各组件进行注册;
所述文件生成单元包括:
配置解析子单元,用于对所述组件间依赖关系信息进行解析,以生成所述多个组件中各组件间的依赖树图;
数组生成子单元,用于在所述依赖树图为有向无环图的情况下,利用拓扑排序算法,对所述依赖树图进行解析,以生成依赖数组,所述依赖数组表征所述多个组件中组件之间的依赖关系;
逻辑生成子单元,用于利用所述依赖数组,生成所述项目代码的注册文件。
7.根据权利要求6所述的装置,其特征在于,所述注解解析单元具体用于:
利用注解处理器,在所述项目代码中读取所述组件的注解代码并对所述注解代码进行解析,以得到注解配置信息,所述注解配置信息中至少包括:所述多个组件的组件间依赖关系信息。
8.根据权利要求6所述的装置,其特征在于,所述逻辑注册单元具体用于:
在对所述多个组件中的各组件进行注册时,加载所述注册文件,以使得所述多个组件中的各组件按照所述注册文件中的注册逻辑信息依次进行注册。
9.根据权利要求6所述的装置,其特征在于,还包括:
组件注入单元,用于基于所述注解配置信息中的组件注入信息,在所述项目代码中筛选出包含注入类的目标组件,在所述目标组件中注入目标代码,所述目标代码用于调用所述目标组件中所需插入的组件,所述目标代码中至少包括所述目标组件中所需插入的组件的名称。
10.一种服务器,其特征在于,包括:
处理器和存储器;
其中,所述处理器用于执行所述存储器中存储的程序;
所述存储器用于存储程序,所述程序至少用于:
获得项目代码,所述项目代码中包括多个组件的代码,所述项目代码中对于其他组件存在依赖关系的组件编写有相应的注解代码;
对所述项目代码中所述组件的注解代码进行解析,以得到注解配置信息,所述注解配置信息中至少包括:所述项目代码中多个组件的组件间依赖关系信息;
对所述组件间依赖关系信息进行解析,以生成所述多个组件中各组件间的依赖树图;
在所述依赖树图为有向无环图的情况下,利用拓扑排序算法,对所述依赖树图进行解析,以生成依赖数组,所述依赖数组表征所述多个组件中组件之间的依赖关系;
利用所述依赖数组,生成所述项目代码的注册文件,所述注册文件中至少包括所述多个组件中组件之间的注册逻辑信息,所述注册文件中至少包括所述多个组件中组件之间的注册逻辑信息;
基于所述注册文件中的注册逻辑信息,对所述多个组件中的各组件进行注册。
11.一种存储介质,其特征在于,所述存储介质中存储有计算机可执行指令,所述计算机可执行指令被处理器加载并执行时,实现如上权利要求1至5任一项所述的组件处理方法。
CN201910550779.7A 2019-06-24 2019-06-24 一种组件处理方法、装置、服务器及存储介质 Active CN112214219B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910550779.7A CN112214219B (zh) 2019-06-24 2019-06-24 一种组件处理方法、装置、服务器及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910550779.7A CN112214219B (zh) 2019-06-24 2019-06-24 一种组件处理方法、装置、服务器及存储介质

Publications (2)

Publication Number Publication Date
CN112214219A CN112214219A (zh) 2021-01-12
CN112214219B true CN112214219B (zh) 2023-11-10

Family

ID=74047074

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910550779.7A Active CN112214219B (zh) 2019-06-24 2019-06-24 一种组件处理方法、装置、服务器及存储介质

Country Status (1)

Country Link
CN (1) CN112214219B (zh)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113064814A (zh) * 2021-03-09 2021-07-02 青岛海尔科技有限公司 组件引用数据的处理方法及装置、存储介质及电子装置
CN112988137B (zh) * 2021-03-19 2024-05-17 武汉虹信技术服务有限责任公司 一种类文件导入代码管理系统及方法
CN113032006B (zh) * 2021-04-16 2023-09-08 北京奇艺世纪科技有限公司 插件构建方法、装置、设备和存储介质
CN113050985B (zh) * 2021-04-19 2024-02-06 中国工商银行股份有限公司 前端工程依赖自动注册方法及装置
CN114020693B (zh) * 2021-10-19 2022-07-08 北京五八信息技术有限公司 一种头文件地址的获取方法、装置、电子设备及存储介质
CN114168111B (zh) * 2021-12-07 2024-04-05 北京五八信息技术有限公司 组件化路由实现方法、设备、产品及存储介质
CN114237763B (zh) * 2021-12-23 2023-06-02 建信金融科技有限责任公司 提高组件首次加载速度的方法、装置、设备、介质及产品
CN114327655A (zh) * 2021-12-27 2022-04-12 云南腾云信息产业有限公司 组件的初始化处理方法、装置及电子设备
CN114297089B (zh) * 2022-03-02 2022-07-29 杭州海康威视数字技术股份有限公司 基于容器的Python远程动态调试方法及系统

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6973646B1 (en) * 2000-07-21 2005-12-06 International Business Machines Corporation Method for compiling program components in a mixed static and dynamic environment
CN105718289A (zh) * 2016-01-21 2016-06-29 腾讯科技(深圳)有限公司 一种组件关系建立方法及其设备
CN107391218A (zh) * 2017-07-07 2017-11-24 北京小米移动软件有限公司 编译方法及装置、电子设备和计算机可读存储介质
CN109388403A (zh) * 2018-09-26 2019-02-26 广州视源电子科技股份有限公司 依赖注入方法、装置、设备和存储介质

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6973646B1 (en) * 2000-07-21 2005-12-06 International Business Machines Corporation Method for compiling program components in a mixed static and dynamic environment
CN105718289A (zh) * 2016-01-21 2016-06-29 腾讯科技(深圳)有限公司 一种组件关系建立方法及其设备
CN107391218A (zh) * 2017-07-07 2017-11-24 北京小米移动软件有限公司 编译方法及装置、电子设备和计算机可读存储介质
CN109388403A (zh) * 2018-09-26 2019-02-26 广州视源电子科技股份有限公司 依赖注入方法、装置、设备和存储介质

Also Published As

Publication number Publication date
CN112214219A (zh) 2021-01-12

Similar Documents

Publication Publication Date Title
CN112214219B (zh) 一种组件处理方法、装置、服务器及存储介质
CN105657191B (zh) 一种基于Android系统的应用增量升级方法及系统
CN106547572B (zh) 一种程序文件对比方法及装置
CN109144548A (zh) 一种基于git实现的多组件软件升级方法、装置及服务器
CN111090433A (zh) 一种数据处理的方法、装置和存储介质
CN111061643A (zh) Sdk集群的兼容性检测方法、装置、电子设备及存储介质
CN112965913B (zh) 一种Java软件依赖冲突问题自动化修复的方法
US20140208297A1 (en) Validation of revised computer programs
CN112769706B (zh) 组件化路由方法及系统
CN112099880B (zh) 场景驱动的应用程序约减方法和系统
CN106776266B (zh) 测试工具的配置方法及终端设备
CN114138281A (zh) 软件工程的编译方法、装置、设备及介质
CN110543427A (zh) 测试用例存储方法、装置、电子设备及存储介质
CN112860312A (zh) 项目依赖关系变化的检测方法及装置
CN113377667A (zh) 一种基于场景的测试方法、装置、计算机设备及存储介质
CN110716786B (zh) 一种页面展示方法、系统及存储介质
CN108897588B (zh) 一种用于模块间通信的路由方法和路由装置
CN108694049B (zh) 一种更新软件的方法和设备
CN111240987B (zh) 移植程序检测方法、装置、电子设备及计算机可读存储介质
Corradini et al. Resttestgen: An extensible framework for automated black-box testing of restful apis
CN112416612A (zh) 服务调用方法、装置、计算机设备和可读存储介质
CN111352631A (zh) 一种接口兼容性检测方法及装置
CN116578282A (zh) 代码生成方法、装置、电子设备及介质
CN110737438A (zh) 一种数据处理方法和装置
CN114356783A (zh) 单元测试代码自动生成方法、装置、存储介质及设备

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant