程序组件配置装置及方法与流程

文档序号:19154804发布日期:2019-11-16 00:35阅读:251来源:国知局
本发明涉及软件技术,特别涉及适用于不同数据库框架的统一程序组件编程。
背景技术
::软件模块化设计使得软件功能可扩展性成为可能。通常为了实现某一特定的功能,开发人员可设计专门的功能组件,将所需功能封装成一个软件开发工具包(sdk)组件,提供给应用程序app,这些功能组件例如以插件的形式根据需要嵌入到应用程序中,app只需要调用sdk提供的接口即可实现所封装的功能,从而达到丰富应用程序的功能。在app组件开发中,sdk组件经常需要进行数据库存储操作,例如消息盒子组件需要在本地存储消息的内容,而数据库存储就必须调用app本身接入的数据库框架来实现。因此需要为符合不同数据库框架的app开发相应的sdk组件。例如对于存储消息详情,其中消息详情包括标题title和内容content。如果app使用sqlite数据库框架进行数据库存储,则在消息盒子组件中需要定义模型类:之后,调用sqlite数据库框架接口来实现具体message数据的存储。对于实现同样的存储消息详情的功能,如果app使用ormlite框架进行数据库存储,则需要另外定义模型类:之后,调用ormlite数据库框架接口实现该模型类中message数据的存储。可以看到,对于支持不同数据库框架类型的app,即使是开发相同功能的sdk组件,也需要分别编制不同的程序,例如,在sqlite数据库框架下,不存在标解,而在ormlite框架下通常需要在编程时定义注解,即上述程序中以@引导的语法。技术实现要素:为了避免因app所支持的数据库框架不同而开发具有完全相同功能但不同编程的sdk组件,出于组件设计的角度,希望提供统一的编程代码,能配置到不同数据库框架下app使用,而不是根据不同app使用数据库框架的情况来配置数据类和调用数据库存储的代码逻辑。为此,本发明提出一种使用统一的自定义注解,通过注解处理器在编译阶段将自定义注解转换为适于各个不同数据库框架的注解的方案,在程序运行期再通过反射操作转换注解模型类,从而实现利用同一套代码可以运行在不同应用程序app下的目的。按照本发明的一个方面,提供一种用于配置程序组件的装置,其中所述程序组件包含利用统一注解标注的原始数据模型类,该装置包括:注解处理器,用于基于应用程序采用的数据库框架类型,将所述原始数据模型类转换为与所述数据库框架类型匹配的新注解模型类;数据库操作接口,用于接收来自所述应用程序的对所述程序组件的调用请求;以及反射处理器,用于响应于所述调用请求,将与所述应用程序采用的数据库框架类型对应的新注解模型类传送给所述应用程序采用的数据库框架。在一个优选实施例中,2、该程序组件的配置装置进一步包括:类型确定模块,用于确定装载所述程序组件的所述应用程序采用的数据库框架类型;其中,如果所述程序组件中的原始数据模型类与所述数据库框架类型不匹配,则所述注解处理器将所述原始数据模型类转换为与所述数据库框架类型匹配的新注解模型类。按照本发明的一个方面,提供一种配置程序组件的方法,其中所述程序组件包含利用统一注解标注的原始数据模型类,包括:基于应用程序采用的数据库框架类型,将所述原始数据模型类转换为与所述数据库框架类型匹配的新注解模型类;接收来自所述应用程序的对所述程序组件的调用请求;响应于所述调用请求,将与所述应用程序采用的数据库框架类型对应的新注解模型类传送给所述应用程序采用的数据库框架。。按照本发明的一个方面,提供一种智能终端,包括:存储器,用于存储应用程序;处理器,用于执行所述应用程序,其中应用程序编程为包括插件,该插件包括:数据库操作接口,用于接收来自所述应用程序的对所述插件的调用请求;以及反射处理器,用于响应于所述调用请求,将所述插件中、与所述应用程序采用的数据库框架类型对应的新注解模型类传送给所述应用程序使用的数据库框架,其中所述新注解模型类是基于利用由所述插件中的统一注解标注的原始数据模型类生成的,以实现所述插件的功能。按照本发明的一个方面,提供一种机器可读介质,其上存储有程序代码,其中该程序代码在由机器执行时使该机器执行本发明的方法。附图说明图1示出根据一个实施例的程序组件的示意框图;图2a示出根据一个实施例的编译时数据模型类转换示意框图;图2b示出根据一个实施例的程序运行时数据模型类调用示意框图;图3示出根据另一个实施例的程序运行时数据模型类调用示意框图;图4示出根据一个实施例的app、组件、注解处理器与反射处理器的相互操作示意图;图5示出根据一个实施例的程序组件执行的流程图;图6示出根据本发明一个实施例的终端示意图。具体实施方式下面结合附图对本发明实施例提供的装置与方法及进行详细说明。虽然附图中显示了本公开的优选实施方式,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整的传达给本领域的技术人员。以下以java编程为例来阐述本发明的构思与实施例。java语言目前得到广泛应用,特别地在java语言5.0版本中开始支持加入源代码的特殊语法元数据。java语言中的类、方法、变量、参数和包等都可以被标注,且支持自定义java标注。和javadoc不同,java标注可以通过反射获取标注内容。在java源码的编译过程中,注解可以被注解处理器处理并生成包含信息的消息或附加的java源码文件或资源,同时新增的java源码文件也可能会被编译和处理并修改被注解的代码本身。此外,java语言提供了java反射机制,用于观察并修改程序在运行时的行为。在java中,反射允许在编译期间不知道接口的名称,字段(fields,即成员变量)、方法的情况下在运行时检查类、接口、字段和方法。它还允许根据判断结果进行实例化新对象和不同方法的调用。本发明的一个或多个实施例利用java的注解解释与反射机制来实现适用于多数据库框架的统一编程。图1示出根据本发明一个实施例的程序组件100,这里程序组件100可以是一个独立的sdk组件或插件,可以嵌入在应用程序app中,以调用sdk组件预编制的功能,例如对数据库访问操作。按照本发明的一个或多个实施例,配置装置102集成在程序组件100内,当希望将程序组件100集成到应用程序app中时,配置装置102可按照应用程序app的特性,对程序组件100的程序以及运行机制进行适配性配置。这里的应用程序app可以是已知的可在智能终端上运行的任意应用程序,而智能终端可能是包括例如计算机、手机、平板等的计算装置。如图1所示,程序组件100包括程序101以及配置装置102。程序101中存储有利用统一注解标注的原始数据模型类original_class,用于实现预定的功能。这里的统一注解可以是自定义的注解,例如自定义java标注。如下示出了利用自定义注解标注的原始数据模型类original_class的一个示例:在该例中,使用统一注解iapdatabasetable,iapdatabasefield标注了数据库模型类message类,在模型类中定义了方法、属性等操作参数。配置装置102包括类型确定模块104、注解处理器106、数据库操作接口108以及反射处理器110。当将sdk组件100集成到应用程序app中并进行编译时,类型确定模块104确定装载该sdk组件100的应用程序app所采用的数据库框架类型db_frame。这里的数据库框架类型可以是现有技术已知的在app上通用的任何类型,例如sqlite、ormlite、greendao等。作为一个示例,类型确定模块104可以进一步判断sdk组件中的原始数据模型类original_class与所确定的数据库框架类型db_frame是否匹配,这里的匹配是指数据库框架是否支持原始数据模型类及其统一注解。例如当数据库框架db_frame支持所述统一注解或者当数据库框架db_frame在运行时不需要注解时,则认为原始数据模型类与数据库框架类型db_frame匹配。如果程序101中的原始数据模型类original_class与数据库框架类型db_frame不匹配,注解处理器106基于原始数据模型类original_class生成与数据库框架类型db_frame匹配的新注解模型类new_class,并将新注解模型类new_class存储到程序101中,这里原始数据模型类与新注解模型类实现sdk组件的同一预定功能。按照本发明的一个示例,在生成新注解模型类new_class时,注解处理器106扫描原始数据模型类original_class的统一注解,以将该统一注解转换为符合数据库框架类型db_frame的特定注解,用于标注新注解模型类new_class。同时,利用一个标识符区将新注解模型类与原始数据类相关联,例如,在原始数据类的类名中加入标识符。作为示例,图2a示出了当应用程序app采用ormlite数据库框架时,由注解处理器106实现的类转换。如图所示,在本例中,sdk组件100是一个消息盒子组件,用于存储消息,其中该消息盒子组件具有原始数据模型类message,其中定义了消息的标题(title)以及消息内容(content),此外,该消息利用自定义统一注解@iapdatabasetable,@iapdatabasefield对类中涉及的数据库及方法属性进行标注。由于该自定义统一注解@iapdatabasetable,@iapdatabasefield不是当前应用程序app采用的数据库框架ormlite所支持的注解,因此在编译期间,注解处理器106扫描消息盒子组件中带有统一注解模型类message类,将统一注解@iapdatabasetable,@iapdatabasefield分别转换成ormlite所支持的注解@databasetable,@databasefield,同时创建新注解模型类genmessage类,该新注解模型类类名由原始模型类类名message加前缀“gen”构成。当应用程序app运行并希望调用sdk组件以实现预定功能时,数据库操作接口108接收来自应用程序app的对sdk组件的调用请求call_sdk,并通过组件数据库操作接口108传入应用程序app使用的数据库框架的数据库操作具体请求,例如存储。这里需要指出的是,sdk组件100在执行具体的数据库操作时是利用原始模型类original_class实现的,但实际数据库存储由应用程序app数据库框架例如(ormlite)实现。为此,反射处理器110响应于调用请求call_sdk,将与应用程序app采用的数据库框架类型对应的新注解模型类new_class的类对象传送给应用程序app的数据库框架。如图2b所示,以采用ormlite数据库框架的应用程序app为例,反射处理器110利用数据库操作接口108接收该应用程序app的调用请求call_sdk,并可确定当前app支持的注解模型类为ormlite数据模型类。因此,反射处理器110遍历原始数据模型类,以获取模型类的类对象,该类对象包括类中的参数及sdk组件在执行具体的数据库操作时产生的各参数的参数值。仍以上面消息盒子组件为例,通过反射处理,反射处理器110可以获取到原始数据模型类的类对象(message.class)以及该类对象中的消息标题(title)以及内容(content)的具体值,反射处理器110将所获取的参数具体值封装到新注解模型类genmessage中的相应特征参数title与content中。随后,反射处理器110将新注解模型类的类对象genmessage.class传送给应用程序app中的ormlite数据库框架,以实现数据库在对消息的存储操作。这里需要指出的是,上面仅以message消息类为例予以说明,但是,原始数据模型类original_class并不限于一种实体类,还可以包含其它类型的类与更多数量的实体类,在运行中,反射处理器110可以遍历所有的实体类及类中的各对象,并转换到新注解模型类new_class中。此外,需要指出的是,本例中类型确定模块104也不是配置装置102中必不可少的部件,例如配置装置102可以直接从外部接收用户指定的应用程序app所采用的数据库框架类型db_frame,并进而判断程序组件100中的原始数据模型类original_class与所指定的数据库框架类型db_frame是否匹配。图3示出了sdk组件中的原始数据模型类original_class与数据库框架类型db_frame匹配的一个示例,其中以消息盒子组件作为sdk组件的示例。如图所示,这里的app采用sqlite数据库框架,其在运行时不需要注解,因此在编译阶段,注解处理器106不需要对统一注解做任何转换。在app运行时,可通过数据库操作接口直接使用原始数据模型类message中的各对象。图4示出了在编译与执行阶段在应用程序app、sdk组件、注解处理器以及反射处理器之间的操作示意图,这里需要说明的是,为了便于说明的目的,sdk组件、注解处理器以及反射处理器是分离设置的。如图中1.1所示,在sdk组件的程序101中事先编制了用统一注解标的原始数据模型类original_class。例如对于图2a所示的消息盒子组件,其中用自定义统一注解@iapdatabasetable,@iapdatabasefield标注了原始数据模型类的message类。如图中1.2所示,在编译阶段,当希望将sdk组件集成到app中时,可将app所支持的数据库框架类型db_frame传送给注解处理器。如图中1.3所示,注解处理器根据数据库框架类型db_frame生成支持数据库框架db_frame的对应的新注解模型类。如图2a所示,在数据库框架类型db_frame为ormlite时,注解处理器扫描sdk组件中带有统一注解的模型类message类,将其中的统一注解@iapdatabasetable,@iapdatabasefield转换成支持ormlite的新注解@databasetable,@databasefield,并创建数据模型类genmessage类,该新注解模型类类名由模型类类名message加前缀标识符“gen”构成。随后在1.4,注解处理器将创建的数据模型类genmessage类返回给sdk组件,例如存储在程序101中。当app运行例如希望调用sdk组件以实现预定功能例如消息存储时,如图中2.1所示,app通过数据库操作接口向sdk组件发出调用请求call_sdk,sdk组件操作原始数据模型类例如message类来执行消息存储操作,操作结果例如消息的标题与内容存储在message类的title与content属性中。同时,如2.2所示,反射处理器基于发出调用请求的当前app的数据库框架类型db_frame,从程序101中查找与类型db_frame对应的新注解模型类new_class。例如,如图2b所示,当app支持的是ormlite数据库框架时,反射处理器可确定对应的新注解模型类为ormlite。随后,如2.3所示,反射处理器获取原始模型类的class对象例如message.class,以生成新注解模型类的class对象例如genmessage.class。作为一个示例,由反射处理器生成新注解模型类的class对象的过程如下:(1)、从原始模型类的类对象与新注解模型类的类对象的映射关系缓存中获取新注解模型类的类(class)对象。如果缓存不存在,则通过反射从原始模型类的类对象获取模型类的类名,添加标识符例如“gen”后形成新注解模型类的类名,然后,通过反射基于原始模型类的类对象来生成新注解模型类的类对象,并将原始模型类的类对象与新注解模型类的类对象的映射关系存入映射缓存中。(2)、从缓存中获取原始模型类和新注解模型类的成员变量名与字段(field)对象的映射关系,其中任一缓存不存在,则通过反射获取原始模型类或新注解模型类上的成员变量名与字段对象的映射关系写入缓存;(3)、遍历新注解模型类成员变量名,对每一个成员变量名,从原始模型类的成员变量名与字段对象的映射关系缓存中获取字段对象,并通过反射获取原始模型类对象上同名成员变量的值,并将原始模型类对象的成员变量值通过反射设置到新注解模型类对象的同名成员变量上。返回到图4所示,如2.4所示,通过反射处理后,反射处理器返回新注解模型类的类对象genmessage.class。从而如2.5与2.6所示,在app的ormlite数据库框架下基于新注解模型类的类对象genmessage.class实现对数据库的实际操作,app可以将操作例如消息存储的结果返回。图5示出根据本发明一个实施例的配置sdk组件的流程图,为便于说明,在以下示例中,以消息盒子组件为例,并且app分别采用ormlite与sqlite二种数据库框架进行数据库操作。在消息盒子组件中封装有利用java语言自定义的统一注解标注的原始数据模型类,例如,如图5所示,在步骤502,当期望在app中集成该消息盒子组合时,在app编译阶段,确定期望装载消息盒子组件的应用程序app所采用的数据库框架类型db_frame,如前所述,其中确定框架类型db_frame既可以通过用户指定实现,也可以自行判断实现。随后进程前到步骤504,判断该数据库框架类型db_frame是否与原始数据模型类original_class匹配。如果当前app采用的数据库框架db_frame与原始数据模型类original_class不匹配,例如当前app采用的是ormlite框架,则进程前到步骤506。在步骤506,利用注解处理器扫描原始数据模型类original_class的统一注解,以将该统一注解转换为符合当前app的数据库框架类型db_frame的特定注解,用于标注所述新注解模型类new_class。同时,利用一个标识符区将新注解模型类与原始数据类相关联。如图2a所示的示例,在当前app采用ormlite数据库框架时,注解处理器106扫描消息盒子组件,将统一注解@iapdatabasetable,@iapdatabasefield分别转换成ormlite所支持的注解@databasetable,@databasefield,同时创建新注解模型类genmessage类,该新注解模型类类名由模型类类名message加前缀“gen”构成。进而,完成整个app的编译处理。如果在步骤504确定当前app采用的数据库框架与原始数据模型类original_class匹配时,例如当前app采用的是sqlite框架时,则无需要注解转换处理,直接完成整个app的编译处理。在步骤508,在应用程序app运行阶段,通过数据库操作接口接收来自app的调用请求,例如消息存储操作。在步骤510,基于调用请求,确定与当前应用程序app的数据库框架相匹配的数据模型类。如前示例所述,如果当前app采用sqlite框架,则可以直接基于原始数据模型类original_class进行数据存储操作,如图3所示;而如果当前app采用ormlite框架,则前进至步骤512。如前所述,在编译阶段,已经在sdk组件中事先转换有新注解模型类ormlite数据模型类,如图2b所示,因此在步骤512,利用反射机制,响应于调用请求,将与应用程序采用的ormlite框架对应的ormlite新注解模型类传送给应用程序app中的ormlite数据库框架。对于本例中的消息盒子组件,通过反射处理,反射处理器可以获取到原始数据模型类的类对象(message.class)以及该类对象中的消息标题(title)以及内容(content)的具体值,反射处理器将所获取的参数具体值封装到新注解模型类genmessage中的相应特征参数title与content中。随后,在步骤514,反射处理器将新注解模型类的类对象genmessage.class传送给应用程序app中的ormlite数据库框架,以实现数据库在对消息的存储操作。利用本发明的方案,可以通过注解处理器自动生成针对不同数据库框架(例如sqlite、ormlite)的新注解模型类,再在实际数据库操作中使用java反射机制获取生成的新注解类对象,这样就在同一套统一的注解基础上,使用原始数据模型类,切换到不同的数据库框架下进行实际数据库操作。根据本发明,该应用程序app可以安装于任何终端,例如计算机、手机等。图6示例性示出一种智能终端,其包括存储有应用程序app的存储器以及处理器,其中该处理器可执行所存储的应用程序以实现数据库访问。按照本发明的一个或多个实施例,应用程序app被编程为包括插件以实现预定的功能,其中该插件包括:数据库操作接口以及反射处理器,其中数据库操作接口用于接收来自应用程序的对插件的调用请求,然后,响应于所述调用请求,反射处理器将所述插件中、与应用程序app采用的数据库框架类型对应的新注解模型类传送给所述应用程序使用的数据库框架,其中所述新注解模型类是基于利用由所述插件中的统一注解标注的原始数据模型类生成的,以实现所述插件的功能。在一个示例中,反射处理器获取原始数据模型类中特征参数及其参数值,并将所获取的参数值封装为所述新注解模型类中的相应特征参数的参数值,其中所述原始数据模型类中的参数值是所述程序组件操作所述原始数据模型类而生成的。这里需要指出的是,除了图6所示的处理器、内存、以及非易失性存储器之外,实施例中实现程序组件执行的智能终端通常根据其实际功能,还可以包括其它硬件,对此不再赘述。这里需要指出的是,虽然结合上述优选实施例描述了本发明,但显然本发明不限于此。此外,图1中的各模块可以包括处理器、电子设备、硬件设备、电子部件、逻辑电路、存储器、软件代码、固件代码等,或者它们的任意组合。技术人员还将认识到的是,结合本文公开内容描述的各种说明性的逻辑方框、模块和方法步骤可以实现为电子硬件、计算机软件或二者的组合。以软件实现为例,作为一个逻辑意义上的设备,是通过处理器将非易失性存储器中对应的计算机程序指令读取内存中运行形成的。本发明另一实施例提供的机器可读介质上存储有机器可读指令,该机器可读指令在被计算机执行时,使计算机执行本文公开的前述的任一种方法。具体地,可以提供配有机器可读介质的系统或者装置,在该机器可读介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统的计算机读出并执行存储在该机器可读介质中的机器可读指令。在这种情况下,从机器可读介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此机器可读代码和存储机器可读代码的机器可读介质构成了本发明的一部分。需要说明的是,上述各流程和装置的结构图中不是所有的步骤或模块都是必须的,可以根据实际的需要忽略某些步骤或模块。各步骤的执行顺序不是固定的,可以根据需要进行调整。上述各实施例中描述的系统结构可以是物理结构,也可以是逻辑结构,即,有些模块可能由同一物理实体实现,或者,有些模块可能分由多个物理实体实现,或者,可以由多个独立设备中的某些部件共同实现。上文通过附图和优选实施例对本发明进行了详细展示和说明,然而本发明不限于这些已揭示的实施例,基与上述多个实施例本领域技术人员可以知晓,可以组合上述不同实施例中的代码审核手段得到本发明更多的实施例,这些实施例也在本发明的保护范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1