CN116700728A - 动态代码生成方法、装置、电子设备和存储介质 - Google Patents
动态代码生成方法、装置、电子设备和存储介质 Download PDFInfo
- Publication number
- CN116700728A CN116700728A CN202210178155.9A CN202210178155A CN116700728A CN 116700728 A CN116700728 A CN 116700728A CN 202210178155 A CN202210178155 A CN 202210178155A CN 116700728 A CN116700728 A CN 116700728A
- Authority
- CN
- China
- Prior art keywords
- dynamic
- code
- abstract syntax
- syntax tree
- template
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 81
- 230000003068 static effect Effects 0.000 claims abstract description 44
- 238000004458 analytical method Methods 0.000 claims abstract description 41
- 238000002372 labelling Methods 0.000 claims abstract description 18
- 238000006243 chemical reaction Methods 0.000 claims description 9
- 238000004590 computer program Methods 0.000 claims description 3
- 238000012545 processing Methods 0.000 description 16
- 230000008569 process Effects 0.000 description 10
- 238000004891 communication Methods 0.000 description 8
- 238000010586 diagram Methods 0.000 description 6
- 230000006870 function Effects 0.000 description 5
- 230000006978 adaptation Effects 0.000 description 2
- 230000000644 propagated effect Effects 0.000 description 2
- 230000002159 abnormal effect Effects 0.000 description 1
- 230000009471 action Effects 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 230000003190 augmentative effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000006835 compression Effects 0.000 description 1
- 238000007906 compression Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000002708 enhancing effect Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
- 230000003252 repetitive effect Effects 0.000 description 1
- 238000012827 research and development Methods 0.000 description 1
- 239000004984 smart glass Substances 0.000 description 1
- 230000002123 temporal effect Effects 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/425—Lexical analysis
-
- 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
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/447—Target code generation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/51—Source to source
-
- 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)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Stored Programmes (AREA)
Abstract
本公开提供了一种动态代码生成方法、装置、电子设备和存储介质,涉及程序开发技术领域。其中,动态代码生成方法包括:获取抽象语法树,所述抽象语法树基于标注源代码生成;识别出所述抽象语法树中被标注的指定实体类;对所述被标注的指定实体类进行动态注解解析,得到动态参数;获取与所述动态参数匹配的静态代码模板;基于模板执行引擎将所述动态参数和所述静态代码模板转换为动态代码。通过本公开的技术方案,能够有效简化配置流程,并减少配置操作的工作量,进而有利于减少因配置错误,导致的不符合预期的情况出现的概率,从而提升配置操作的可靠性。
Description
技术领域
本公开涉及程序开发技术领域,尤其涉及一种动态代码生成方法、装置、电子设备和计算机可读存储介质。
背景技术
为了提高程序的开发效率,相关技术中,提出了代码自动生成的方案,通过配置XML(Extensible Markup Language,可扩展标记语言)文件,并将XML文件作为动态参数的输入单元,通过对XML文件的配置,可以获取生成动态代码变化部分的参数信息。
基于上述处理过程可知,为了保证代码生成的可靠性,需要预先对配置文件进行大量的配置工作,尤其是在针对需要通过配置文件描述实体类中的字段名及字段类型信息的场景中,需要通过在配置文件中定义数组,并添加复杂的XML结构来描述字段信息,上述配置过程目前存在以下缺陷:
由于配置工作量大,并且配置过程繁琐复杂,因此常出现配置错误的问题,进而使生成的代码出现偏差,并导致程序的运行异常,最终结果研发人员反复调整配置文件,导致影响代码的生成效率。
需要说明的是,在上述背景技术部分公开的信息仅用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。
发明内容
本公开的目的在于提供一种动态代码生成方法、装置、电子设备和计算机可读存储介质,至少在一定程度上能够改善相关技术中代码生成过程中为了得到配置文件而导致的配置工作量大以及配置操作不够可靠的问题。
本公开的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本公开的实践而习得。
根据本公开的一个方面,提供一种动态代码生成方法,包括:获取抽象语法树,所述抽象语法树基于标注源代码生成;识别出所述抽象语法树中被标注的指定实体类;对所述被标注的指定实体类进行动态注解解析,得到动态参数;获取与所述动态参数匹配的静态代码模板;基于模板执行引擎将所述动态参数和所述静态代码模板转换为动态代码。
在一个实施例中,所述对所述被标注的指定实体类进行动态注解解析,得到动态参数,具体包括:基于服务提供发现接口在编译期触发对所述被标注的指定实体类进行动态注解解析,得到所述动态参数。
在一个实施例中,所述基于服务提供发现接口在编译期触发对所述被标注的指定实体类进行动态注解解析,得到所述动态参数,具体包括:基于所述服务提供发现接口调用注释元素获取模型;将所述被标注的指定实体类导入所述注释元素获取模型;基于所述注释元素获取模型解析所述被标注的指定实体类,以返回注解元素信息,并将所述注解元素信息确定为所述动态参数。
在一个实施例中,所述获取与所述动态参数匹配的静态代码模板,具体包括:确定所述动态参数所属的业务领域;获取由所述模板执行引擎定义的与所述业务领域对应的所述静态代码模板。
在一个实施例中,所述基于模板执行引擎将所述动态参数和所述静态代码模板转换为动态代码,具体包括:将所述动态参数加载至所述静态代码模板,生成模板代码;基于所述模板执行引擎将加载的所述模板代码转换为所述动态代码。
在一个实施例中,还包括:基于所述服务提供发现接口调用文档对象获取方法;基于所述文档对象获取方法生成方法实例;基于所述方法实例将所述动态代码转换为CLASS文件;以及基于编译器对所述动态代码执行JAVA语法转换,以生成JAVA源文件;将所述CLASS文件和所述JAVA源文件存储在编译结果目录中。
在一个实施例中,所述获取抽象语法树,具体包括:对初始源代码进行自定义注解标注,得到所述标注源代码;基于所述标注源代码生成抽象语法树,所述抽象语法树包括所述被标注的抽象语法树和未被标注的抽象语法树,所述被标注的抽象语法树具有注解标识;所述识别出所述抽象语法树中被标注的指定实体类,具体包括:基于所述注解标识识别出所述抽象语法树中的所述被标注的指定实体类。
在一个实施例中,所述基于所述标注源代码生成抽象语法树,具体包括:对所述注解源代码执行词法分析,生成词法分析结果;对所述词法分析结果执行语法分析,得到初始语法树;对所述初始语法树执行语义分析,得到所述抽象语法树。
根据本公开的另一方面,提供一种动态代码生成装置,包括:第一获取模块,用于获取抽象语法树,所述抽象语法树基于标注源代码生成;识别模块,用于识别出所述抽象语法树中被标注的指定实体类;解析模块,用于对所述被标注的指定实体类进行动态注解解析,得到动态参数;第二获取模块,用于获取与所述动态参数匹配的静态代码模板;转换模块,用于基于模板执行引擎将所述动态参数和所述静态代码模板转换为动态代码。
根据本公开的再一方面,提供一种电子设备,包括:处理器;以及存储器,用于存储处理器的可执行指令;其中,处理器配置为经由执行可执行指令来执行上述另一个方面所述的动态代码生成方法。
根据本公开的又一方面,提供一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述任意一项的动态代码生成方法。
本公开的实施例所提供的动态代码生成方案,通过动态注解解析抽象语法树上被标注的指定实体类,以解析出实体类上携带的字段定义信息,作为代码生成的动态参数,然后结合匹配的静态代码模板,并进一步调用模板执行引擎,将具有动态参数的静态代码模板转换为动态代码,从而能够进一步将动态代码编译为字节码文件,以在运行期进行运行,与相关技术中的方案相比,不需要为了在配置文件描述实体类中的字段名及字段类型信息而添加复杂的XML结构,因此能够有效简化配置流程,并减少配置操作的工作量,进而有利于减少因配置错误,导致的不符合预期的情况出现的概率,从而提升配置操作的可靠性。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示出本公开实施例中一种动态代码生成系统结构的示意图;
图2示出本公开实施例中一种动态代码生成方法的流程图;
图3示出本公开实施例中另一种动态代码生成方法的流程图;
图4示出本公开实施例中再一种动态代码生成方法的流程图;
图5示出本公开实施例中一种动态代码生成方案的示意图;
图6示出本公开实施例的又一种动态代码生成方法的流程图;
图7示出本公开实施例中又一种动态代码生成方法的流程图;
图8示出本公开实施例中又一种动态代码生成方法的流程图;
图9示出本公开实施例中又一种动态代码生成方法的流程图;
图10示出本公开实施例中一种动态代码生成装置的示意图;
图11示出本公开实施例中一种电子设备的示意图。
具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本公开将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施方式中。
此外,附图仅为本公开的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
本申请提供的方案,与相关技术中的方案相比,不需要为了在配置文件描述实体类中的字段名及字段类型信息而添加复杂的XML结构,因此能够有效简化配置流程,并减少配置操作的工作量,进而有利于减少因配置错误,导致的不符合预期的情况出现的概率,从而提升配置操作的可靠性。
为了便于理解,下面首先对本申请涉及到的几个名词(缩写词)进行解释。
源代码:指用java编写的文本(字符串序列)。
字节代码:由于计算机不能直接执行源代码,需要用叫编译器的程序(javac.exe)将源代码翻译成字节码,然后使用解释器执行字节码,实现程序的运行。
编译期:是指把源码交给编译器编译成计算机可以执行的文件的过程。在Java中也就是把Java代码编成class文件的过程.编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作,比如检查错误。
class文件:要运行一段Java源码,必须先将源码转换为class文件,class文件就是编译器编译之后供虚拟机解释执行的二进制字节码文件。
运行期:是把编译后的文件交给计算机执行,直到程序运行结束。所谓运行期就把在磁盘中的代码放到内存中执行起来,在Java中把磁盘中的代码放到内存中就是类加载过程,类加载是运行期的开始部分。
FreeMarker是一款模板执行引擎,即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。
SPI全称为(Service Provider Interface),是JDK内置的一种服务提供发现接口。简单来说,是一种动态替换发现的机制。
图1示出本公开实施例中一种动态代码生成系统的结构示意图,包括多个终端120和服务器集群140。
终端120可以是手机、游戏主机、平板电脑、电子书阅读器、智能眼镜、MP4(MovingPicture Experts Group Audio Layer IV,动态影像专家压缩标准音频层面4)播放器、智能家居设备、AR(Augmented Reality,增强现实)设备、VR(Virtual Reality,虚拟现实)设备等移动终端,或者,终端120也可以是个人计算机(Personal Computer,PC),比如膝上型便携计算机和台式计算机等等。
其中,终端120中可以安装有用于提供的动态代码生成的应用程序。
终端120与服务器集群140之间通过通信网络相连。可选的,通信网络是有线网络或无线网络。
服务器集群140是一台服务器,或者由若干台服务器组成,或者是一个虚拟化平台,或者是一个云计算服务中心。服务器集群140用于为提供动态代码生成应用程序提供后台服务。可选地,服务器集群140承担主要计算工作,终端120承担次要计算工作;或者,服务器集群140承担次要计算工作,终端120承担主要计算工作;或者,终端120和服务器集群140之间采用分布式计算架构进行协同计算。
在一些可选的实施例中,服务器集群140用于存储动态代码生成模型等。
可选地,不同的终端120中安装的应用程序的客户端是相同的,或两个终端120上安装的应用程序的客户端是不同控制系统平台的同一类型应用程序的客户端。基于终端平台的不同,该应用程序的客户端的具体形态也可以不同,比如,该应用程序客户端可以是手机客户端、PC客户端或者全球广域网(World Wide Web,Web)客户端等。
本领域技术人员可以知晓,上述终端120的数量可以更多或更少。比如上述终端可以仅为一个,或者上述终端为几十个或几百个,或者更多数量。本申请实施例对终端的数量和设备类型不加以限定。
可选的,该系统还可以包括管理设备(图1未示出),该管理设备与服务器集群140之间通过通信网络相连。可选的,通信网络是有线网络或无线网络。
可选的,上述的无线网络或有线网络使用标准通信技术和/或协议。网络通常为因特网、但也可以是任何网络,包括但不限于局域网(Local Area Network,LAN)、城域网(Metropolitan Area Network,MAN)、广域网(Wide Area Network,WAN)、移动、有线或者无线网络、专用网络或者虚拟专用网络的任何组合)。在一些实施例中,使用包括超文本标记语言(Hyper Text Mark-up Language,HTML)、可扩展标记语言(ExtensibleMarkupLanguage,XML)等的技术和/或格式来代表通过网络交换的数据。此外还可以使用诸如安全套接字层(Secure Socket Layer,SSL)、传输层安全(Transport Layer Security,TLS)、虚拟专用网络(Virtual Private Network,VPN)、网际协议安全(InternetProtocolSecurity,IPsec)等常规加密技术来加密所有或者一些链路。在另一些实施例中,还可以使用定制和/或专用数据通信技术取代或者补充上述数据通信技术。
下面,将结合附图及实施例对本示例实施方式中的动态代码生成方法中的各个步骤进行更详细的说明。
图2示出本公开实施例中一种动态代码生成方法流程图。本公开实施例提供的方法可以由任意具备计算处理能力的电子设备执行,例如如图1中的终端120和/或服务器集群140。在下面的举例说明中,以终端120为执行主体进行示例说明。
如图2所示,服务器集群140执行动态代码生成方法,包括以下步骤:
步骤S202,获取抽象语法树,抽象语法树基于标注源代码生成。
其中,通过对源代码进行预处理,即对源代码添加自定义注解,生成标注源代码,标注源代码可以存储在待生成动态代码库中。
另外,抽象语法树(abstract syntax tree,AST)用于表示抽象除了源代码的结构,树上的每个节点都表示源代码中的一种结构。
步骤S204,识别出抽象语法树中被标注的指定实体类。
其中,指定实体类可以为POJO(Plain Old Java Objects)实体类,可以理解为简单JAVA对象。
另外,由于被标注的指定实体类具有标注标记,因此通过对标记的识别,可以识别出哪些指定实体类是被标注的实体类。
步骤S206,对被标注的指定实体类进行动态注解解析,得到动态参数。
其中,动态注解解析在编译期执行。
动态参数包括但不限于对指定实体类定义的字段类型与字段名等信息,动态参数具体可以理解为指定领域的标签数据。
具体地,通过动态注解解析操作,能够自动解析出实体类的字段名以及字段类型等信息,从而不需要执行相关技术中为了在配置文件中描述实体类的字段名以及字段类型等新信息而添加复杂的XML结构。
步骤S208,获取与动态参数匹配的静态代码模板。
其中,静态代码模板为包含模板语言的模板文件,通过静态代码模板结合作为动态数据对象的动态参数作为动态代码生成的输入参数,结合模板执行引擎和模板语言即可输出动态代码,以基于动态代码生成HTML网页等输出文件。
步骤S210,基于模板执行引擎将动态参数和静态代码模板转换为动态代码。
其中,动态代码可以理解为指定领域的代码。
在该实施例中,在编译期,通过动态注解解析抽象语法树上被标注的指定实体类,以解析出实体类上携带的字段定义信息,作为代码生成的动态参数,然后结合匹配的静态代码模板,并进一步调用模板执行引擎,将具有动态参数的静态代码模板转换为动态代码,从而能够进一步将动态代码编译为字节码文件,以在运行期进行运行,与相关技术中的方案相比,不需要为了在配置文件描述实体类中的字段名及字段类型信息而添加复杂的XML结构,因此能够有效简化配置流程,并减少配置操作的工作量,进而有利于减少因配置错误,导致的不符合预期的情况出现的概率,从而提升配置操作的可靠性。
在一个实施例中,对被标注的指定实体类进行动态注解解析,得到动态参数,具体包括:基于服务提供发现接口在编译期触发对被标注的指定实体类进行动态注解解析,得到动态参数。
其中,服务提供发现接口具体可以为SPI接口,SPI接口提供注解处理器javax.annotation.processing.AbstractProcessor,以基于注解处理器获取被标注的指定实体类上的注解信息,作为动态参数。
在该实施例中,通过设置服务提供发现接口进行注解处理,在编译期获取指定实体类上包括的字段名以及字段类型等的类定义信息,能够实现字段名以及字段类型的自动获取与配置,从而简化了输入参数的获取方式。
如图3所示,在一个实施例中,上述的基于服务提供发现接口在编译期触发对被标注的指定实体类进行动态注解解析,得到动态参数的一种具体实现方式,包括:
步骤S302,基于服务提供发现接口调用注释元素获取模型。
步骤S304,将被标注的指定实体类导入注释元素获取模型。
步骤S306,基于注释元素获取模型解析被标注的指定实体类,以返回注解元素信息,并将注解元素信息确定为动态参数。
在该实施例中,
如图4所示,在一个实施例中,步骤S208中,获取与动态参数匹配的静态代码模板的一种具体实现方式,包括:
步骤S402,确定动态参数所属的业务领域。
其中,作为业务领域的一种划分方式,基于应用的显示界面进行业务领域的划分,比如,商品展示页面,订单页面、付款页面等。
步骤S404,获取由模板执行引擎定义的与业务领域对应的静态代码模板。
在该实施例中,每个业务领域可以对应于一类业务页面,动态参数则为该业务页面的动态的数据对象,通过确定与动态参数的业务领域匹配的静态代码模板,则可结合动态参数和静态代码模板,自动生成动态输入参数。
在一个实施例中,步骤S210中,基于模板执行引擎将动态参数和静态代码模板转换为动态代码的一种具体实现方式,包括:
步骤S406,将动态参数加载至静态代码模板,生成模板代码。
步骤S408,基于模板执行引擎将加载的模板代码转换为动态代码。
在该实施例中,如图5所示,作为一种具体的实现方式,采用FreeMarker作为模板执行引擎506,并采用FreeMarker定义的静态代码模板504,采用生成的指定领域的动态参数502对静态代码模板504进行渲染,得到模板代码,进一步基于模板执行引擎506将模板代码转换为指定领域的业务数据,实现了动态代码508的自动生成,从而进一步生成用于指定领域的显示界面的JAVA源文件。
如图6所示,在一个实施例中,还包括:
步骤S602,基于服务提供发现接口调用文档对象获取方法。
其中,服务提供发现接口具体为SPI接口提供的注解处理器javax.annotation.processing.AbstractProcessor。
步骤S604,基于文档对象获取方法生成方法实例。
步骤S606,基于方法实例将动态代码转换为CLASS文件。
步骤S608,基于编译器对动态代码执行JAVA语法转换,以生成JAVA源文件。
步骤S610,将CLASS文件和JAVA源文件存储在编译结果目录中。
在该实施例中,通过使用SPI接口提供的注解处理器javax.annotation.processing.AbstractProcessor,由注解处理器提供init函数,通过向init函数导入ProcessingEnvironment变量,执行初始化过程,以获取各种工具类,具体为使用ProcessingEnvironment获取一些实用类以及获取选项参数等,获取的工具类中包括文档对象获取方法javax.annotation.processing.ProcessingEnvironment#getFiler,然后获得javax.annotation.processing.Filer实例作为方法实例,进而通过方法实例创建新类,即CLASS文件,另一方面,基于编译器生成JAVA源文件,并进一步保存在target目录下generated-sources文件夹下。
其中,编译器具体为JavaCompiler。
如图7所示,在一个实施例中,获取抽象语法树,具体包括:
步骤S702,对初始源代码进行自定义注解标注,得到标注源代码。
步骤S704,基于标注源代码生成抽象语法树,抽象语法树包括被标注的抽象语法树和未被标注的抽象语法树,被标注的抽象语法树具有注解标识。
识别出抽象语法树中被标注的指定实体类,具体包括:
步骤S706,基于注解标识识别出抽象语法树中的被标注的指定实体类。
如图8所示,在一个实施例中,基于标注源代码生成抽象语法树,具体包括:
步骤S802,对注解源代码执行词法分析,生成词法分析结果。
其中,在词法分析的过程中,源代码程序被输入到了一个叫做扫描器的东西中,扫描器的任务就是进行词法分析。他应用了一种叫做有限状态机的算法把源代码分割成一个一个的记号。
步骤S804,对词法分析结果执行语法分析,得到初始语法树。
其中,语法分析则由分析器去扫描扫描器产生的那些记号去进行语法分析,产生语法树,整个过程采用了上下文无关语法的分析手段,由语法分析树生成的树是以表达式为节点的树,即初始语法树。
步骤S806,对初始语法树执行语义分析,得到抽象语法树。
其中,语义分析由语义分析器来完成,语法分析器仅完成了语法的对错,编译器能分析的语义是静态语义,即编译期可以确定的语义,相反,动态语义则是在运行的时候才确定的语义,基于语义分析对初始语法树进行优化,得到抽象语法树。
如图9所示,根据本公开的另一个实施例的动态代码生成方法,具体包括:
步骤S902,获取添加自定义注解的标注源代码。
步骤S904,对标注源代码依次执行词法分析、语法分析、以及语义分析,生成抽象语法树。
步骤S906,识别出抽象语法树中被标注的指定实体类。
步骤S908,解析指定实体类携带的所属领域的域定义信息作为动态信息。
步骤S910,获取与所属领域匹配的静态代码模板。
步骤S912,基于模板执行引擎,结合动态新和静态代码模板,生成动态代码。
步骤S914,基于字节码生成器将动态代码转换为JAVA源文件。
具体的,在本公开的动态编码生成方案的执行步骤中,可以分为基于编译器执行和基于代码生成器执行两部分。
其中,基于编译器在将源代码编译为字节码的过程中,执行的步骤包括:源代码依次经过词法分析器、语法分析器和语义分析器生成抽象语法树。
基于代码生成器执行的步骤包括识别抽象语法树中被注解的指定实体类,解析注解得到指定领域的字段定义信息,结合静态代码模板得到模板代码,由模板执行引擎将模板代码转换为动态代码。
具体地,指定实体类为POJO实体类,通过解析POJO实体类上应用的注解,获得指定领域的字段定义信息,然后通过不同类型的静态代码模板,调用模板执行引擎,将静态代码模板转变生成特定类型的领域代码,最后通过编译器将生成的代码编译为字节码。
需要注意的是,上述附图仅是根据本发明示例性实施例的方法所包括的处理的示意性说明,而不是限制目的。易于理解,上述附图所示的处理并不表明或限制这些处理的时间顺序。另外,也易于理解,这些处理可以是例如在多个模块中同步或异步执行的。
所属技术领域的技术人员能够理解,本发明的各个方面可以实现为系统、方法或程序产品。因此,本发明的各个方面可以具体实现为以下形式,即:完全的硬件实施方式、完全的软件实施方式(包括固件、微代码等),或硬件和软件方面结合的实施方式,这里可以统称为“电路”、“模块”或“系统”。
下面参照图10来描述根据本发明的这种实施方式的动态代码生成装置1000。图10所示的动态代码生成装置1000仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
动态代码生成装置1000以硬件模块的形式表现。动态代码生成装置1000的组件可以包括但不限于:第一获取模块1002,用于获取抽象语法树,抽象语法树基于标注源代码生成;识别模块1004,用于识别出抽象语法树中被标注的指定实体类;解析模块1006,用于对被标注的指定实体类进行动态注解解析,得到动态参数;第二获取模块1008,用于获取与动态参数匹配的静态代码模板;第一转换模块1010,用于基于模板执行引擎将动态参数和静态代码模板转换为动态代码。
在一个实施例中,解析模块1006还用于:基于服务提供发现接口在编译期触发对被标注的指定实体类进行动态注解解析,得到动态参数。
在一个实施例中,解析模块1006还用于:基于服务提供发现接口调用注释元素获取模型;将被标注的指定实体类导入注释元素获取模型;基于注释元素获取模型解析被标注的指定实体类,以返回注解元素信息,并将注解元素信息确定为动态参数。
在一个实施例中,第二获取模块1008还用于:确定动态参数所属的业务领域;获取由模板执行引擎定义的与业务领域对应的静态代码模板。
在一个实施例中,第一转换模块1010还用于:将动态参数加载至静态代码模板,生成模板代码;基于模板执行引擎将加载的模板代码转换为动态代码。
在一个实施例中,还包括:第二转换模块1012,用于基于服务提供发现接口调用文档对象获取方法;基于文档对象获取方法生成方法实例;基于方法实例将动态代码转换为CLASS文件;以及基于编译器对动态代码执行JAVA语法转换,以生成JAVA源文件;将CLASS文件和JAVA源文件存储在编译结果目录中。
在一个实施例中,第一获取模块1002还用于:对初始源代码进行自定义注解标注,得到标注源代码;基于标注源代码生成抽象语法树,抽象语法树包括被标注的抽象语法树和未被标注的抽象语法树,被标注的抽象语法树具有注解标识;识别出抽象语法树中被标注的指定实体类,具体包括:基于注解标识识别出抽象语法树中的被标注的指定实体类。
在一个实施例中,第一获取模块1002还用于:对注解源代码执行词法分析,生成词法分析结果;对词法分析结果执行语法分析,得到初始语法树;对初始语法树执行语义分析,得到抽象语法树。
下面参照图11来描述根据本发明的这种实施方式的电子设备1100。图11显示的电子设备1100仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图11所示,电子设备1100以通用计算设备的形式表现。电子设备1100的组件可以包括但不限于:上述至少一个处理单元1110、上述至少一个存储单元1120、连接不同系统组件(包括存储单元1120和处理单元1110)的总线1130。
其中,存储单元存储有程序代码,程序代码可以被处理单元1110执行,使得处理单元1110执行本说明书上述“示例性方法”部分中描述的根据本发明各种示例性实施方式的步骤。例如,处理单元1110可以执行如图2中所示的步骤S202、S204至S210,以及本公开的动态代码生成方法中限定的其他步骤。
存储单元1120可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(RAM)11201和/或高速缓存存储单元11202,还可以进一步包括只读存储单元(ROM)11203。
存储单元1120还可以包括具有一组(至少一个)程序模块11205的程序/实用工具11204,这样的程序模块11205包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
总线1130可以为表示几类总线结构中的一种或多种,包括存储单元总线或者存储单元控制器、外围总线、图形加速端口、处理单元或者使用多种总线结构中的任意总线结构的局域总线。
电子设备1100也可以与一个或多个外部设备1160(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得用户能与该电子设备交互的设备通信,和/或与使得该电子设备1100能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口1150进行。并且,电子设备1100还可以通过网络适配器1150与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器1150通过总线1130与电子设备1100的其它模块通信。应当明白,尽管图中未示出,可以结合电子设备使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、终端装置、或者网络设备等)执行根据本公开实施方式的方法。
在本公开的示例性实施例中,还提供了一种计算机可读存储介质,其上存储有能够实现本说明书上述方法的程序产品。在一些可能的实施方式中,本发明的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当程序产品在终端设备上运行时,程序代码用于使终端设备执行本说明书上述“示例性方法”部分中描述的根据本发明各种示例性实施方式的步骤。
根据本发明的实施方式的用于实现上述方法的程序产品,其可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在终端设备,例如个人电脑上运行。然而,本发明的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本发明操作的程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。
应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。
此外,尽管在附图中以特定顺序描述了本公开中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。附加的或备选的,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、移动终端、或者网络设备等)执行根据本公开实施方式的方法。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由所附的权利要求指出。
Claims (11)
1.一种动态代码生成方法,其特征在于,包括:
获取抽象语法树,所述抽象语法树基于标注源代码生成;
识别出所述抽象语法树中被标注的指定实体类;
对所述被标注的指定实体类进行动态注解解析,得到动态参数;
获取与所述动态参数匹配的静态代码模板;
基于模板执行引擎将所述动态参数和所述静态代码模板转换为动态代码。
2.根据权利要求1所述的动态代码生成方法,其特征在于,所述对所述被标注的指定实体类进行动态注解解析,得到动态参数,具体包括:
基于服务提供发现接口在编译期触发对所述被标注的指定实体类进行动态注解解析,得到所述动态参数。
3.根据权利要求2所述的动态代码生成方法,其特征在于,所述基于服务提供发现接口在编译期触发对所述被标注的指定实体类进行动态注解解析,得到所述动态参数,具体包括:
基于所述服务提供发现接口调用注释元素获取模型;
将所述被标注的指定实体类导入所述注释元素获取模型;
基于所述注释元素获取模型解析所述被标注的指定实体类,以返回注解元素信息,并将所述注解元素信息确定为所述动态参数。
4.根据权利要求1所述的动态代码生成方法,其特征在于,所述获取与所述动态参数匹配的静态代码模板,具体包括:
确定所述动态参数所属的业务领域;
获取由所述模板执行引擎定义的与所述业务领域对应的所述静态代码模板。
5.根据权利要求4所述的动态代码生成方法,其特征在于,所述基于模板执行引擎将所述动态参数和所述静态代码模板转换为动态代码,具体包括:
将所述动态参数加载至所述静态代码模板,生成模板代码;
基于所述模板执行引擎将加载的所述模板代码转换为所述动态代码。
6.根据权利要求2所述的动态代码生成方法,其特征在于,还包括:
基于所述服务提供发现接口调用文档对象获取方法;
基于所述文档对象获取方法生成方法实例;
基于所述方法实例将所述动态代码转换为CLASS文件;以及
基于编译器对所述动态代码执行JAVA语法转换,以生成JAVA源文件;
将所述CLASS文件和所述JAVA源文件存储在编译结果目录中。
7.根据权利要求1至6中任一项所述的动态代码生成方法,其特征在于,所述获取抽象语法树,具体包括:
对初始源代码进行自定义注解标注,得到所述标注源代码;
基于所述标注源代码生成抽象语法树,所述抽象语法树包括所述被标注的抽象语法树和未被标注的抽象语法树,所述被标注的抽象语法树具有注解标识;
所述识别出所述抽象语法树中被标注的指定实体类,具体包括:
基于所述注解标识识别出所述抽象语法树中的所述被标注的指定实体类。
8.根据权利要求7所述的动态代码生成方法,其特征在于,所述基于所述标注源代码生成抽象语法树,具体包括;
对所述注解源代码执行词法分析,生成词法分析结果;
对所述词法分析结果执行语法分析,得到初始语法树;
对所述初始语法树执行语义分析,得到所述抽象语法树。
9.一种动态代码生成装置,其特征在于,包括:
第一获取模块,用于获取抽象语法树,所述抽象语法树基于标注源代码生成;
识别模块,用于识别出所述抽象语法树中被标注的指定实体类;
解析模块,用于对所述被标注的指定实体类进行动态注解解析,得到动态参数;
第二获取模块,用于获取与所述动态参数匹配的静态代码模板;
转换模块,用于基于模板执行引擎将所述动态参数和所述静态代码模板转换为动态代码。
10.一种电子设备,其特征在于,包括:
处理器;以及
存储器,用于存储所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令来执行权利要求1~8中任意一项所述的动态代码生成方法。
11.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1~8中任意一项所述的动态代码生成方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210178155.9A CN116700728A (zh) | 2022-02-25 | 2022-02-25 | 动态代码生成方法、装置、电子设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210178155.9A CN116700728A (zh) | 2022-02-25 | 2022-02-25 | 动态代码生成方法、装置、电子设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116700728A true CN116700728A (zh) | 2023-09-05 |
Family
ID=87839787
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210178155.9A Pending CN116700728A (zh) | 2022-02-25 | 2022-02-25 | 动态代码生成方法、装置、电子设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116700728A (zh) |
-
2022
- 2022-02-25 CN CN202210178155.9A patent/CN116700728A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112104709B (zh) | 智能合约的处理方法、装置、介质及电子设备 | |
US7346897B2 (en) | System for translating programming languages | |
US8332828B2 (en) | System for translating diverse programming languages | |
CN110704063B (zh) | 编译和执行智能合约的方法及装置 | |
CN110704064B (zh) | 编译和执行智能合约的方法及装置 | |
US7401325B2 (en) | Method and apparatus for a configurable Java Server pages processing framework | |
CN103218294A (zh) | 一种嵌入式系统的调试方法、调试转换装置和系统 | |
CN110543297A (zh) | 用于生成源码的方法和装置 | |
CN102566984A (zh) | 一种配置参数的方法及装置 | |
CN114153459A (zh) | 接口文档生成方法及装置 | |
CN110737431A (zh) | 软件开发方法、开发平台、终端设备及存储介质 | |
CN113127136A (zh) | Docker镜像生成方法及装置、存储介质、电子设备 | |
US10606569B2 (en) | Declarative configuration elements | |
CN116841559A (zh) | 代码转换方法、装置、设备、介质和程序产品 | |
CN115640279A (zh) | 一种数据血缘关系的构建方法和装置 | |
CN116700728A (zh) | 动态代码生成方法、装置、电子设备和存储介质 | |
CN115495089A (zh) | 基于网页的接口文档的生成方法、装置及服务器 | |
CN111539200B (zh) | 一种生成富文本的方法、装置、介质和电子设备 | |
CN111880775A (zh) | 多模块分层架构实现方法、装置、电子设备、存储介质 | |
CN113448874A (zh) | 一种单元测试脚本的生成方法及装置 | |
CN114816972A (zh) | 着色语言的测试方法、装置、电子设备以及存储介质 | |
CN114003317B (zh) | 内联实现方法及装置、电子设备、存储介质及程序产品 | |
Stoeckle et al. | A framework for visual notation exchange | |
CN113032003B (zh) | 开发文件导出方法、装置、电子设备及计算机存储介质 | |
CN114936026B (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 |