CN111158667B - 代码注入方法和装置、电子设备及存储介质 - Google Patents
代码注入方法和装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN111158667B CN111158667B CN202010002458.6A CN202010002458A CN111158667B CN 111158667 B CN111158667 B CN 111158667B CN 202010002458 A CN202010002458 A CN 202010002458A CN 111158667 B CN111158667 B CN 111158667B
- Authority
- CN
- China
- Prior art keywords
- program code
- code
- annotation
- generating
- syntax tree
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- Y—GENERAL 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
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本申请提供的代码注入方法和装置、电子设备及存储介质,涉及程序开发技术领域。在本申请中,首先,基于预先配置的代码预处理器对第一程序代码进行预处理,并基于预处理的结果生成语法树对象。其次,基于语法树对象确定位置信息和生成第二程序代码,其中,该位置信息用于标识该第二程序代码需要注入至第一程序代码的位置。然后,基于位置信息将第二程序代码注入至第一程序代码。通过上述方法,可以改善在现有的程序开发过程中由于需要开发人员对第一程序代码和第二程序代码一并进行开发而存在开发效率低的问题。
Description
技术领域
本申请涉及程序开发技术领域,具体而言,涉及一种代码注入方法和装置、电子设备及存储介质。
背景技术
在程序开发技术中,横切关注点是指,与主要功能的实现无关的次要功能。例如,针对一段虚拟按钮程序,可以设置一个横切关注点,以统计用户的点击该程序对应的按钮的次数。
经发明人研究发现,在现有的程序开发过程中,开发人员一般是将主要功能对应的程序代码和横切关注点对应的程序代码一并进行开发,因而,存在着开发效率低的问题。
发明内容
有鉴于此,本申请的目的在于提供一种代码注入方法和装置、电子设备及存储介质,以改善在现有的程序开发过程中由于需要开发人员对第一程序代码和第二程序代码一并进行开发而存在开发效率低的问题。
为实现上述目的,本申请实施例采用如下技术方案:
一种代码注入方法,包括:
基于预先配置的代码预处理器对第一程序代码进行预处理,并基于预处理的结果生成语法树对象;
基于所述语法树对象确定位置信息和生成第二程序代码,其中,该位置信息用于标识该第二程序代码需要注入至所述第一程序代码的位置;
基于所述位置信息将所述第二程序代码注入至所述第一程序代码。
在本申请实施例较佳的选择中,在上述代码注入方法中,所述基于预先配置的代码预处理器对第一程序代码进行预处理,并基于预处理的结果生成语法树对象的步骤,包括:
基于对注解处理器的继承操作配置生成代码预处理器;
基于所述代码预处理器对第一程序代码进行预处理生成目标文件,并基于该目标文件生成语法树对象。
在本申请实施例较佳的选择中,在上述代码注入方法中,所述基于该目标文件生成语法树对象的步骤,包括:
对所述目标文件中的初始化方法进行处理,得到所述第一程序代码的环境对象,并基于该环境对象生成语法树对象。
在本申请实施例较佳的选择中,在上述代码注入方法中,所述基于所述语法树对象确定位置信息和生成第二程序代码的步骤,包括:
从所述第一程序代码包括的至少一个注解中确定目标注解,并基于所述语法树对象生成语法树节点操作对象和语法树构建对象;
基于所述目标注解和所述语法树节点操作对象确定位置信息;
基于所述目标注解和所述语法树构建对象生成第二程序代码。
在本申请实施例较佳的选择中,在上述代码注入方法中,所述从所述第一程序代码包括的至少一个注解中确定目标注解的步骤,包括:
对目标文件中的注解获取方法进行处理,得到所述第一程序代码包括的至少一个注解中的目标注解,其中,所述目标文件为所述第一程序代码所在的文件。
在本申请实施例较佳的选择中,在上述代码注入方法中,所述基于所述目标注解和所述语法树节点操作对象确定位置信息的步骤,包括:
基于所述目标注解和所述语法树节点操作对象确定目标程序代码段的接口信息,其中,所述第一程序代码包括至少一个程序代码段,所述接口信息用于标识所述目标程序代码段在所述第一程序代码中的位置。
在本申请实施例较佳的选择中,在上述代码注入方法中,所述基于所述目标注解和所述语法树构建对象生成第二程序代码的步骤,包括:
基于所述语法树构建对象生成至少一个代码生成方法;
基于所述至少一个代码生成方法和所述目标注解生成第二程序代码。
本申请实施例还提供了一种代码注入装置,包括:
对象生成模块,用于基于预先配置的代码预处理器对第一程序代码进行预处理,并基于预处理的结果生成语法树对象;
对象处理模块,用于基于所述语法树对象确定位置信息和生成第二程序代码,其中,该位置信息用于标识该第二程序代码需要注入至所述第一程序代码的位置;
代码注入模块,用于基于所述位置信息将所述第二程序代码注入至所述第一程序代码。
上述基础上,本申请实施例还提供了一种电子设备,包括:
存储器,用于存储计算机程序;
与所述存储器连接的处理器,用于执行所述计算机程序,以实现上述的代码注入方法。
上述基础上,本申请实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被执行时实现上述的代码注入方法。
本申请提供的代码注入方法和装置、电子设备及存储介质,通过代码预处理器对第一程序代码(如主要功能对应的程序代码)进行处理后,基于处理的结果生成语法树对象,使得可以基于该语法树对象确定位置信息和生成第二程序代码(如横切关注点对象的程序代码),然后,根据确定的位置信息将该第二程序代码注入至第一程序代码。如此,一方面,可以实现第一程序代码和第二程序代码开发的分离,以改善在现有的程序开发过程中由于需要开发人员对第一程序代码和第二程序代码一并进行开发而存在开发效率低的问题。另一方面,还可以实现第二程序代码的自动生成,减少开发人员的工作量,从而进一步提高开发效率。
为使本申请的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
图1为本申请实施例提供的电子设备的方框示意图。
图2为本申请实施例提供的代码注入方法包括的各步骤的流程示意图。
图3为图2中步骤S110包括的各子步骤的流程示意图。
图4为本申请实施例提供的一种语法树对象的示意图。
图5为图2中步骤S120包括的各子步骤的流程示意图。
图6为本申请实施例提供的代码注入装置包括的各功能模块的方框示意图。
图标:10-电子设备;12-存储器;14-处理器;100-代码注入装置;110-对象生成模块;120-对象处理模块;130-代码注入模块。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例只是本申请的一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
如图1所示,本申请实施例提供了一种电子设备10,可以包括存储器12和处理器14,该存储器12内可以设置有代码注入装置100。
其中,所述存储器12和处理器14之间直接或间接地电性连接,以实现数据的传输或交互。例如,相互之间可通过一条或多条通讯总线或信号线实现电性连接。所述代码注入装置100包括至少一个可以软件或固件(firmware)的形式存储于所述存储器12中的软件功能模块。所述处理器14用于执行所述存储器12中存储的可执行的计算机程序,例如,所述代码注入装置100所包括的软件功能模块及计算机程序等,以实现本申请实施例提供的代码注入方法。
可选地,所述存储器12可以是,但不限于,随机存取存储器(Random AccessMemory,RAM),只读存储器(Read Only Memory,ROM),可编程只读存储器(ProgrammableRead-Only Memory,PROM),可擦除只读存储器(Erasable Programmable Read-OnlyMemory,EPROM),电可擦除只读存储器(Electric Erasable Programmable Read-OnlyMemory,EEPROM)等。
所述处理器14可以是一种通用处理器,包括中央处理器(Central ProcessingUnit,CPU)、网络处理器(Network Processor,NP)、片上***(System on Chip,SoC)等;还可以是数字信号处理器(DSP)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
可以理解,图1所示的结构仅为示意,所述电子设备10还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置,例如,还可以包括用于与其它设备进行信息交互的通信单元。
其中,所述电子设备10的具体类型不受限制,可以根据实际应用需求进行选择,只要具有一定的数据处理能力即可,例如,在一种可以替代的示例中,所述电子设备10包括电脑、个人计算机等。
结合图2,本申请实施例还提供一种可应用于上述电子设备10的代码注入方法。其中,该代码注入方法有关的流程所定义的方法步骤可以由所述电子设备10实现。下面将对图2所示的具体流程进行详细阐述。
步骤S110,基于预先配置的代码预处理器对第一程序代码进行预处理,并基于预处理的结果生成语法树对象。
在本实施例中,在开发人员完成第一程序代码的开发工作之后,且在通过编译器对该第一程序代码进行编译之前,可以先通过预先配置的代码预处理器对该第一程序代码进行预处理,然后,基于预处理的结果生成语法树对象。
其中,所述第一程序代码可以为开发人员基于想要实现的主要功能开发的程序代码,如一个登陆页面中用于确定的虚拟按钮,对应的程序代码。并且,所述语法树对象可以是指,编程语言的源代码的抽象语法结构的树状表现形式,也可以称为抽象语法树(Abstract Syntax Tree,AST)。
步骤S120,基于所述语法树对象确定位置信息和生成第二程序代码。
在本实施例中,基于步骤S110生成语法树对象之后,一方面,可以基于该语法树对象确定位置信息,另一方面,也可以基于该语法树对象生成第二程序代码。
其中,所述位置信息用于标识所述第二程序代码需要注入至所述第一程序代码的位置。所述第二程序代码可以为,在所述第一程序代码对应的主要功能的基础上,想要实现的辅助功能(也称为横切关注点),如用于对上述的虚拟按钮的用户点击次数进行统计。
步骤S130,基于所述位置信息将所述第二程序代码注入至所述第一程序代码。
在本实施例中,基于步骤S120确定位置信息并生成第二程序代码之后,可以基于该位置信息将该第二程序代码注入至所述第一程序代码。
例如,若确定的位置信息为A信息,可以将所述第二程序代码注入至所述第一程序代码的A位置;若确定的位置信息为B信息,可以将所述第二程序代码注入至所述第一程序代码的B位置;若确定的位置信息为C信息,可以将所述第二程序代码注入至所述第一程序代码的C位置。
基于上述方法,一方面,可以实现所述第一程序代码和所述第二程序代码开发的分离,以改善在现有的程序开发过程中由于需要开发人员对第一程序代码和第二程序代码一并进行开发而存在开发效率低的问题。另一方面,还可以实现第二程序代码的自动生成,减少开发人员的工作量,从而进一步提高程序代码的开发效率。
对于步骤S110需要说明的是,对第一程序代码进行预处理的具体方式不受限制,可以根据实际应用需求进行选择,如基于代码预处理器的不同,进行的预处理可以不同。
例如,在一种可以替代的示例中,可以响应用户的操作编写代码预处理器的程序代码,且该操作基于用户想要进行的预处理功能进行。
又例如,在另一种可以替代的示例中,为了提高进行预处理的效率,可以基于继承的方式生成代码预处理器。基于此示例,结合图3,步骤S110可以包括步骤S111和步骤S113,具体内容如下所述。
步骤S111,基于对注解处理器的继承操作配置生成代码预处理器。
在本实施例中,在完成第一程序代码的开发工作之后,且在通过编译器对该第一程序代码进行编译之前,可以先基于对注解处理器的继承曹操,生成相应的代码预处理器,从而完成该代码预处理器的配置工作。
步骤S113,基于所述代码预处理器对第一程序代码进行预处理生成目标文件,并基于该目标文件生成语法树对象。
在本实施例中,基于步骤S111生成代码预处理器之后,可以先基于该代码预处理器去获取所述第一程序代码。其次,可以基于该代码预处理器对该第一程序代码进行预处理,从而生成相应的目标文件。然后,可以基于该目标文件生成相应的语法树对象。
可选地,执行步骤S111以通过继承操作生成代码预处理器的具体方式也不受限制,可以根据实际应用需求进行选择。例如,基于不同的程序语言,可以有不同的选择。
详细地,在一种具体的应用示例中,若所述第一程序代码的程序语言为Java(一种面向对象的编程语言),可以建立一个Java源代码的编译拦截类(Yome Java Compiler),该编译拦截类作为所述代码预处理器,且该代码预处理器继承于同样属于Java源代码的注解处理器(javax.annotation.processing.AbstractProcessor)。
可选地,基于步骤S113生成目标文件的具体方式也不受限制,可以根据实际应用需求进行选择。例如,基于不同的程序语言,可以有不同的选择。
详细地,在一种具体的应用示例中,若所述第一程序代码的程序语言为Java(一种面向对象的编程语言),可以将该第一程序代码转换为class文件,以完成上述的预处理。
其中,上述的class文件,也成为Java class文件,是一种可以运行在任何支持Java虚拟机的硬件平台和操作***上的二进制可执行文件。
可选地,基于步骤S113生成语法树对象的具体方式也不受限制,可以根据实际应用需求进行选择。例如,基于不同的程序语言(如Python的语法树不同于Java Script的语法树),可以有不同的选择。
详细地,在一种具体的应用示例中,若所述第一程序代码的程序语言为Java(一种面向对象的编程语言),可以通过以下子步骤生成语法树对象:
首先,可以对所述目标文件中的初始化方法进行处理,得到所述第一程序代码的环境对象;其次,可以基于该环境对象生成语法树对象。
其中,上述的初始化方法是上述的代码预处理器具有的,因此,基于所述代码预处理器生成目标文件之后,可以基于对该目标文件中的初始化方法进行处理,从而得到所述第一程序代码的环境对象。
可以理解的是,上述的初始化方法可以是指,在Java的程序语言中的int方法。对该int方法进行处理可以是指,对该int方法进行重写(或扩展),使得重写或扩展后的方法,可以获取所述第一程序代码的上下文环境对象(Processing Environment)。
并且,基于所述环境对象生成语法树对象具体方式也不受限制,可以根据实际应用需求进行选择。
例如,在一种可以替代的示例中,可以获取所述环境对象中各变量或运算符等参数,并将各参数分别作为一个节点,然后,基于各节点在所述第一程序代码中的逻辑关系生成相应的语法树对象,如图4所示,就是一种包括变量i、变量x和变量y的语法树对象。
对于步骤S120需要说明的是,对所述语法树对象的处理方式不受限制,可以根据实际应用需求进行选择。
例如,在一种可以替代的示例中,可以在生成所述语法树对象之后,基于开发人员对该语法树对象的选择操作,确定相应的位置信息和生成相应的第二程序代码。
又例如,在另一种可以替代的示例中,为了提高确定位置信息和生成第二程序代码的效率,以进一步提高程序开发的效率,可以在所述语法树的基础上,结合所述第一程序代码中的注解,从而完成确定位置信息和生成第二程序代码的工作。
基于该示例,结合图5,步骤S120可以包括步骤S121、步骤S122和步骤S113,具体内容如下所述。
步骤S121,在所述第一程序代码包括的至少一个注解中确定的目标注解,并基于所述语法树对象生成语法树节点操作对象和语法树构建对象。
在本实施例中,由于所述第一程序代码中包括至少一个注解,且该至少一个注解中具有与待生成的第二程序代码的相关信息,因此,可以先确定该至少一个注解中的目标注解,以便于执行步骤S122和步骤S123。
并且,由于确定位置信息和生成第二程序代码时,具体的逻辑不同,因而,还需要基于所述语法树对象分别生成相应的语法树节点操作对象(如JavacElements)和语法树构建对象(如TreeMaker)。
步骤S122,基于所述目标注解和所述语法树节点操作对象确定位置信息。
在本实施例中,基于步骤S121确定目标注解且生成语法树节点操作对象之后,由于该目标注解和该语法树节点操作对象都具有标识位置的信息,因此,可以基于该目标注解和语法树节点操作对象确定,该目标注解对应的第二程序代码需要注入至所述第一程序代码的位置。
步骤S123,基于所述目标注解和所述语法树构建对象生成第二程序代码。
在本实施例中,基于步骤S121确定目标注解和语法树构建对象之后,由于该目标注解和该语法树构建对象都具有生成所述第二程序代码的相关信息,因此,可以基于该目标注解和该语法树构建对象,生成相应的第二程序代码。
可选地,执行步骤S121确定目标注解的具体方式不受限制,可以根据实际应用需求进行选择。
例如,在一种可以替代的示例中,可以响应开发人员的操作在至少一个注解中确定目标注解。
又例如,在另一种可以替代的示例中,为了提高确定目标注解的效率,步骤S121可以包括以下子步骤以确定目标注解:
可以对目标文件中的注解获取方法进行处理,得到所述第一程序代码包括的至少一个注解中的目标注解。
其中,所述目标文件为所述第一程序代码所在的文件,如上述基于预处理得到的Java语言中的class文件。并且,上述的注解获取方法可以为,Java语言中的get SupportedAnnotation Types。
也就是说,在所述第一程序代码中可能存在多个注解,但是,并不是每个注解都需要生成相应的第二程序代码并注入。因此,需要通过对上述的注解获取方法进行处理,如重写或扩展,使得基于重写或扩展之后的注解获取方法,可以对各注解进行解析(如得到注解的类或方法),从而确定目标注解。
可选地,执行步骤S122确定位置信息的具体方式不受限制,可以根据实际应用需求进行选择。
例如,在一种可以替代的示例中,考虑到所述第一程序代码包括至少一个程序代码段,且每个程序代码段可以通过该程序代码段的接口信息标识该程序代码段在所述第一程序代码中的位置。因此,步骤S122可以包括以下子步骤:基于所述目标注解和所述语法树节点操作对象确定目标程序代码段的接口信息。
也就是说,可以先基于所述目标注解在至少一个程序代码段中确定目标程序代码段,然后,基于所述语法树节点操作对象确定该目标程序代码段的接口信息。
其中,一个程序代码段的接口信息可以是指,该程序代码段的应用程序接口(API,Application Programming Interface)。
可选地,执行步骤S123生成第二程序代码的具体方式也不受限制,可以根据实际应用需求进行选择。
例如,在一种可以替代的示例中,为了提高生成第二程序代码的效率,可以直接基于所述语法树构建对象已经生成的代码生成方法,生成所述第二程序代码。
又例如,在另一种可以替代的示例中,为了避免资源方法的问题,步骤S123可以包括以下子步骤:
首先,可以基于所述语法树构建对象生成至少一个代码生成方法;其次,基于所述至少一个代码生成方法和所述目标注解生成第二程序代码。
也就是说,在本实施例中,不用预先生成较多的代码生成方法,并选择需要的代码生成方法,而可以基于实际需求生成相应的代码生成方法。
例如,在生成所述第二程序代码时,若需要创建一个表达式,可以基于所述语法树构建对象生成一个表达式生成方法,如TreeMaker.Apply。
又例如,在生成所述第二程序代码时,若需要创建if语句,可以基于所述语法树构建对象生成一个If语句生成方法,如TreeMaker.If。
其中,基于所述代码生成方法和所述目标注解生成第二程序代码的具体方式可以是:对所述目标注解进行解析,得到所述第二程序代码的内容逻辑,然后,可以基于该内容逻辑调用相应的代码生成方法,生成相应的代码语句,从而得到包括至少一条代码语句的第二程序代码。
对于步骤S130需要说明的是,基于位置信息将第二程序代码注入至第一程序代码中的具体方式不受限制,可以根据实际应用需求进行选择。
例如,在一种可以替代的示例中,若所述第二程序代码只有一段,且所述位置信息也只有一个,可以将该第二程序代码注入至所述第一程序代码中该位置信息对应的位置。
又例如,在另一种可以替代的示例中,若所述第二程序代码有多段,且每个第二程序代码对应的位置信息为一个,可以将多段所述第二程序代码分别注入至所述第一程序代码中的对应位置。
详细地,在一种具体的应用示例中,若所述第一程序代码包括3个目标程序代码段,分别为代码段1、代码段2和代码段3,且每个目标代码段中都具有一个目标注解,分别为注解1、注解2和注解3,且每个目标注解都不同。
因此,可以将基于注解1生成的代码A注入至代码段1的相应位置,将基于注解2生成的代码B注入至代码段2的相应位置,将基于注解3生成的代码C注入至代码段3的相应位置。
又例如,在另一种可以替代的示例中,若所述第二程序代码有多段,且每个第二程序代码对应的位置信息为多个,可以将多段第二程序代码中的每段第二程序代码,分别注入至所述第一程序代码中的多个对应位置。
详细地,在一种具体的应用示例中,若所述第一程序代码包括3个目标程序代码段,分别为代码段1、代码段2和代码段3,且每个目标代码段中都具有2个目标注解,分别为注解1和注解2。
因此,可以将基于注解1生成的代码A分别注入至代码段1的相应位置(如代码段1的位置A)、代码段2的相应位置(如代码段2的位置B)和代码段3的相应位置(如代码段3的位置C),并可以将基于注解2生成的代码B也分别注入至代码段1的相应位置(如代码段1的位置D)、代码段2的相应位置(如代码段2的位置E)和代码段3的相应位置(如代码段3的位置F)。具体的对应关系,可以如下表所示:
需要说明的是,在上述的示例中,基于相同的目标注解生成的第二程序代码相同,因此,基于相同的目标注解可以仅生成一段相应的第二程序代码,并将该第二程序代码分别注入至相应不同的位置即可。
结合图6,本申请实施例还提供一种可应用于上述电子设备10的代码注入装置100。其中,所述代码注入装置100可以包括对象生成模块110、对象处理模块120和代码注入模块130。
所述对象生成模块110,用于基于预先配置的代码预处理器对第一程序代码进行预处理,并基于预处理的结果生成语法树对象。在本实施例中,所述对象生成模块110可用于执行图2所示的步骤S110,关于所述对象生成模块110的相关内容可以参照前文对步骤S110的描述。
所述对象处理模块120,用于基于所述语法树对象确定位置信息和生成第二程序代码,其中,该位置信息用于标识该第二程序代码需要注入至所述第一程序代码的位置。在本实施例中,所述对象处理模块120可用于执行图2所示的步骤S120,关于所述对象处理模块120的相关内容可以参照前文对步骤S120的描述。
所述代码注入模块130,用于基于所述位置信息将所述第二程序代码注入至所述第一程序代码。在本实施例中,所述代码注入模块130可用于执行图2所示的步骤S130,关于所述代码注入模块130的相关内容可以参照前文对步骤S130的描述。
在本申请实施例中,对应于上述的代码注入方法,还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,该计算机程序运行时执行上述代码注入方法的各个步骤。
其中,前述计算机程序运行时执行的各步骤,在此不再一一赘述,可参考前文对所述代码注入方法的解释说明。
综上所述,本申请提供的代码注入方法和装置、电子设备及存储介质,通过代码预处理器对第一程序代码(如主要功能对应的程序代码)进行处理后,基于处理的结果生成语法树对象,使得可以基于该语法树对象确定位置信息和生成第二程序代码(如横切关注点对象的程序代码),然后,根据确定的位置信息将该第二程序代码注入至第一程序代码。如此,一方面,可以实现第一程序代码和第二程序代码开发的分离,以改善在现有的程序开发过程中由于需要开发人员对第一程序代码和第二程序代码一并进行开发而存在开发效率低的问题。另一方面,还可以实现第二程序代码的自动生成,减少开发人员的工作量,从而进一步提高开发效率。
在本申请实施例所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置和方法实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本申请的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的***来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本申请各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,电子设备,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
Claims (9)
1.一种代码注入方法,其特征在于,包括:
基于预先配置的代码预处理器对第一程序代码进行预处理,并基于预处理的结果生成语法树对象,其中所述第一程序代码用于表征想要实现的主要功能;
基于所述语法树对象确定位置信息和生成第二程序代码,其中,该位置信息用于标识该第二程序代码需要注入至所述第一程序代码的位置,所述第二程序代码用于表征在前述主要功能基础上实现的辅助功能;
基于所述位置信息将所述第二程序代码注入至所述第一程序代码;
其中,所述基于所述语法树对象确定位置信息和生成第二程序代码的步骤,包括:
从所述第一程序代码包括的至少一个注解中确定目标注解,并基于所述语法树对象生成语法树节点操作对象和语法树构建对象,其中所述目标注解具有待生成的第二程序代码的相关信息;
基于所述目标注解和所述语法树节点操作对象确定位置信息;
基于所述目标注解和所述语法树构建对象生成第二程序代码。
2.根据权利要求1所述的代码注入方法,其特征在于,所述基于预先配置的代码预处理器对第一程序代码进行预处理,并基于预处理的结果生成语法树对象的步骤,包括:
基于对注解处理器的继承操作配置生成代码预处理器;
基于所述代码预处理器对第一程序代码进行预处理生成目标文件,并基于该目标文件生成语法树对象。
3.根据权利要求2所述的代码注入方法,其特征在于,所述基于该目标文件生成语法树对象的步骤,包括:
对所述目标文件中的初始化方法进行处理,得到所述第一程序代码的环境对象,并基于该环境对象生成语法树对象。
4.根据权利要求1-3任意一项所述的代码注入方法,其特征在于,所述从所述第一程序代码包括的至少一个注解中确定目标注解的步骤,包括:
对目标文件中的注解获取方法进行处理,得到所述第一程序代码包括的至少一个注解中的目标注解,其中,所述目标文件为所述第一程序代码所在的文件。
5.根据权利要求1-3任意一项所述的代码注入方法,其特征在于,所述基于所述目标注解和所述语法树节点操作对象确定位置信息的步骤,包括:
基于所述目标注解和所述语法树节点操作对象确定目标程序代码段的接口信息,其中,所述第一程序代码包括至少一个程序代码段,所述接口信息用于标识所述目标程序代码段在所述第一程序代码中的位置。
6.根据权利要求1-3任意一项所述的代码注入方法,其特征在于,所述基于所述目标注解和所述语法树构建对象生成第二程序代码的步骤,包括:
基于所述语法树构建对象生成至少一个代码生成方法;
基于所述至少一个代码生成方法和所述目标注解生成第二程序代码。
7.一种代码注入装置,其特征在于,包括:
对象生成模块,用于基于预先配置的代码预处理器对第一程序代码进行预处理,并基于预处理的结果生成语法树对象,其中所述第一程序代码用于表征想要实现的主要功能;
对象处理模块,用于基于所述语法树对象确定位置信息和生成第二程序代码,其中,该位置信息用于标识该第二程序代码需要注入至所述第一程序代码的位置,所述第二程序代码用于表征在前述主要功能基础上实现的辅助功能;
代码注入模块,用于基于所述位置信息将所述第二程序代码注入至所述第一程序代码;
其中,所述对象处理模块基于所述语法树对象确定位置信息和生成第二程序代码的方式,包括:
从所述第一程序代码包括的至少一个注解中确定目标注解,并基于所述语法树对象生成语法树节点操作对象和语法树构建对象,其中所述目标注解具有待生成的第二程序代码的相关信息;
基于所述目标注解和所述语法树节点操作对象确定位置信息;
基于所述目标注解和所述语法树构建对象生成第二程序代码。
8.一种电子设备,其特征在于,包括:
存储器,用于存储计算机程序;
与所述存储器连接的处理器,用于执行所述计算机程序,以实现权利要求1-6任意一项所述的代码注入方法。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被执行时实现权利要求1-6任意一项所述的代码注入方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010002458.6A CN111158667B (zh) | 2020-01-02 | 2020-01-02 | 代码注入方法和装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010002458.6A CN111158667B (zh) | 2020-01-02 | 2020-01-02 | 代码注入方法和装置、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111158667A CN111158667A (zh) | 2020-05-15 |
CN111158667B true CN111158667B (zh) | 2023-08-01 |
Family
ID=70561259
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010002458.6A Active CN111158667B (zh) | 2020-01-02 | 2020-01-02 | 代码注入方法和装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111158667B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111709026B (zh) * | 2020-06-10 | 2023-10-24 | 深圳知释网络技术有限公司 | 静态安全检测方法、装置、计算机设备和存储介质 |
CN112948247A (zh) * | 2021-02-24 | 2021-06-11 | 携程旅游网络技术(上海)有限公司 | 应用程序的操作回放的处理方法、***、设备和介质 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102231109A (zh) * | 2011-07-15 | 2011-11-02 | 南京大学 | 无痕可管理的源代码自动插桩方法 |
CN104657266A (zh) * | 2015-02-10 | 2015-05-27 | 上海创景计算机***有限公司 | 基于脚本的源代码插桩***及方法 |
CN109408354B (zh) * | 2018-11-14 | 2022-07-08 | 拉扎斯网络科技(上海)有限公司 | 应用组件的数据处理方法和装置 |
-
2020
- 2020-01-02 CN CN202010002458.6A patent/CN111158667B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN111158667A (zh) | 2020-05-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11036614B1 (en) | Data control-oriented smart contract static analysis method and system | |
CN107992307B (zh) | 一种函数编译方法及装置 | |
US7975257B2 (en) | Iterative static and dynamic software analysis | |
JP4889204B2 (ja) | シェルに対するコマンドの入力パラメータを処理するための媒体およびシステム | |
KR101432404B1 (ko) | 바이너리 프로그램들을 동적으로 병렬화하는 콘텍스트 대응형 슬라이싱 | |
US8239823B2 (en) | Generating libraries for reflection without project compilation | |
CN110532176B (zh) | 一种智能合约的形式化验证方法、电子装置及存储介质 | |
US8473899B2 (en) | Automatic optimization of string allocations in a computer program | |
KR20060130478A (ko) | 관리 도구 환경 | |
US10360004B2 (en) | Using dynamic information to refine control flow graphs | |
JP2006065861A (ja) | 継ぎ目なくオブジェクトを比較するシステムおよび方法 | |
CN111158667B (zh) | 代码注入方法和装置、电子设备及存储介质 | |
US9311111B2 (en) | Programming environment with support for handle and non-handle user-created classes | |
CN115686631B (zh) | 一种基于知识基的随机指令生成方法、装置及存储介质 | |
CN108920566B (zh) | 一种对SQLite数据库的操作方法、装置及设备 | |
KR20180009589A (ko) | 프로그램 분석 장치 및 방법 | |
CN111243580B (zh) | 语音控制方法、装置及计算机可读存储介质 | |
CN116305131B (zh) | 脚本静态去混淆方法及*** | |
CN115688108B (zh) | 一种webshell静态检测方法及*** | |
CN110045952B (zh) | 代码调用方法与装置 | |
CN116578282A (zh) | 代码生成方法、装置、电子设备及介质 | |
CN111796832B (zh) | 热补丁文件生成方法、装置、设备及存储介质 | |
CN114443028A (zh) | 实现覆盖率收集代码重用的方法、计算机可读介质 | |
CN112612474A (zh) | 产品移植方法、装置、存储介质和电子设备 | |
US20230315862A1 (en) | Method and apparatus for identifying dynamically invoked computer code using literal values |
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 |