信息查询方法及装置
技术领域
本申请涉及计算机技术领域,尤其涉及信息查询方法及装置。
背景技术
在Java等编程语言中提供了注解(Annotation)的语言特性。注解通常声明在包、类、字段、方法、局部变量、方法参数等程序元素的前面,用来对这些元素进行说明或注释,并与这些元素信息关联。因此,注解可以认为是一个接口,程序可以通过反射机制来获取指定程序元素的注解,然后获取注解所关联的程序元素的信息,开发人员则可以利用注解跟踪源代码中的依赖性或执行基本编译时检查代码等。然而,相关技术中如Objective-C等多种编程语言并没有提供注解功能。
发明内容
为克服相关技术中存在的问题,本申请提供了信息查询方法及装置。
根据本申请实施例的第一方面,提供一种信息查询方法,所述方法包括:
从源代码中识别出元素的注解;其中,所述注解为所述源代码中按预设协议编写的代码;
根据所述注解获取所述元素的相关信息;
生成包含所述元素的相关信息的配置文件;
当接收到对所述元素的查询请求时,通过所述配置文件查询所述元素的相关信息。
根据本申请实施例的第二方面,提供一种信息查询装置,所述装置包括:
注解识别模块,用于从源代码中识别出元素的注解;其中,所述注解为所述源代码中按预设协议编写的代码;
信息获取模块,用于根据所述注解获取所述元素的相关信息;
文件生成模块,用于生成包含所述元素的相关信息的配置文件;
信息查询模块,用于当接收到对所述元素的查询请求时,通过所述配置文件查询所述元素的相关信息。
本申请的实施例提供的技术方案可以包括以下有益效果:
本申请实施例所提供的方案,可以在使用编程语言编写程序的源代码时,首先按照预设协议编写用于对元素进行注解的注解代码。后续,利用预设协议,可以从源代码中识别出所有注解,从而根据注解获取到被注解的元素的相关信息。将每个注解所对应的元素的相关信息都写入至配置文件中,则可以通过配置文件查询到元素的相关信息,因此本申请实施例所提供的方案实现了利用注解查询元素信息的功能,为开发人员提供了较多便利。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。
图1是本申请根据一示例性实施例示出的一种信息查询方法的流程图。
图2是本申请根据一示例性实施例示出的一种终端的结构示意图。
图3是本申请根据一示例性实施例示出的一种信息查询装置的框图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
计算机程序(Computer program),也称为软件(software),简称程序(Program)是指一组指示计算机或其他具有信息处理能力装置每一步动作的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。源代码即是指采用某种语言编写的最原始程序的代码。
本申请实施例所提供的方案,可以应用在Objective-C等没有提供注解能力的编程语言中,开发人员可以在使用此类编程语言编写程序的源代码时,首先按照预设协议编写用于对元素进行注解的注解代码。后续,利用预设协议,可以从源代码中识别出所有注解,从而根据注解获取到被注解的元素的相关信息。将每个注解所对应的元素的相关信息都写入至配置文件中,则可以通过配置文件查询到元素的相关信息,因此本申请实施例所提供的方案实现了利用注解查询元素信息的功能,为开发人员提供了较多便利。
如图1所示,图1是本申请根据一示例性实施例示出的一种信息查询方法的流程图,包括以下步骤101至104:
在步骤101中,从源代码中识别出元素的注解;其中,所述注解为所述源代码中按预设协议编写的代码。
在步骤102中,根据所述注解获取所述元素的相关信息。
在步骤103中,生成包含所述元素的相关信息的配置文件。
在步骤104中,当接收到对所述元素的查询请求时,通过所述配置文件查询所述元素的相关信息。
其中,元素是指程序元素,可以包括包、类、字段、方法、局部变量或方法参数等。
当采用Objective-C等没有提供注解能力的编程语言编写程序时,开发人员可以在编写源代码阶段,按照预设协议编写元素的注解。预设协议主要用于区分注解代码与其他代码,并且还可以用于在源代码中,根据协议的具体规定识别出注解代码。因此,预设协议的具体规定可以根据实际需要而设定,例如采用预先约定的特殊的标识、或者编写在预先约定的特殊的位置、或者其他预先约定的语法规则等。
在一个可选的实现方式中,预设协议可以包括如下一种或多种协议:所述注解按注释格式编写、所述注解中包括预设的注解标识、所述注解编写在所述元素的声明之前或所述注解编写在一行代码中。在实际应用中,这几种协议可以择其一种实施,也可以选择多种组合实施。
其中,注解按注释格式编写,可以使源代码在编译时,注解代码不会参与到编译中,即注解不会影响程序代码的执行,无论增加或删除注解,代码都始终如一地执行。常见的编程语言中都包括注释语法,注释一般包括行注释或块注释,通常采用符号“//”来编写单行注释,或者使用“/*”和“*/”来编写大的注释块。
注解中包括预设的注解标识,因此可以根据注解标识从源代码中快速地识别出注解代码。注解标识可以灵活配置,例如可以采用特殊的字符表示注解代码的开始和结束,则注解代码的具体内容可以编写在开始标识及结束标识之间,后续可以结合注释符号、开始标识或结束标识等能快速地从源代码识别出注解代码。
注解编写在所述元素的声明之前,则后续在从源代码识别注解时,由于注解代码后即是元素的声明代码,因此可以快速获取到被注解的元素的名称或其他相关信息。
注解都编写在一行代码中,可以提高从源代码中识别出注释代码的效率。
在其他可选的实现方式中,预设协议还可以包括:在注解中编写元素的属性信息,注解中包括预设的用于标识属性信息的属性标识,则元素的相关信息可包括所述元素的属性信息。利用该协议,开发人员在编写注解时,可以将被注解的元素的属性信息都编写在注解代码中,则后续在识别出注解后能快速便捷地获取到元素的属性信息。其中,注解代码可以采用预先设定的属性标识,被注解元素的属性信息采用该属性标识进行标记,则后续可以根据属性标识快速地获取到注解代码中携带的属性信息。
例如,以下述一段源代码为例进行说明:
上述示例中,以采用Objective-C语言编写的一段源代码为例,在该源代码中第二行代码@implementation ASAppDelegate表示声明了一个名为ASAppDelegate的类,后面的几行代码表示编写了该ASAppDelegate类的一些相关信息。
其中,第一行代码//#pragma annotion(param1:“classParam1”,param2:“classParam2”)即表示一个针对名为ASAppDelegate类的注解,ASAppDelegate类即被注解的元素。
上述例子的注解,所采用的协议包括:
注解编写在注释符号//之后。
注解的标识采用#pragma annotation和括号,其中#pragma annotation表示注解的开始标识,以右括号表示注解代码的结束标识。
注解编写在被注解元素:ASAppDelegate类的声明之前。
整个注解编写在一行代码中。
注解中已编写了元素的属性信息:括号中的param1:“classParam1”,param2:“classParam2”表示该ASAppDelegate类的两个参数,其中一个是名为classParam1的参数,另一个是名为classParam2的参数。该属性信息的编写采用括号作为属性信息标记,被注解元素的属性信息编写在括号之间。
上述示例只示出了源代码中ASAppDelegate类的其中一个注解,可以理解的是,每个元素的代码中可以编写多个注解。例如,仍以ASAppDelegate类的源代码为例,以下示例中编写了3个用于对ASAppDelegate类的一些相关信息进行标记的注解:
上述例子中的三个注解分别是:
//#pragma annotation(type:“default”,param1:“valuehaha”,param2:“value2”)
//#pragma annotation(param1:“classParam1”,param2:“classParam2”)
//#pragma annotation(type:“default”,param1:“methodValue1”,param2:“methodValue2”)
根据上述对预设协议的规定,从源代码中即可快速高效地识别出注解代码。其中,在识别注解代码时,不仅可以识别出注解代码的具体内容,还可以结合注解所在位置的上下文环境,识别出更多有关被注解元素的相关信息。
在本申请实施例中,所述元素的相关信息还可包括源代码文件名,所述源代码文件名可以通过读取编写有所述注解的源代码文件的名称而获得,通过获取该源代码文件名,开发人员可以快速地获取到被注解元素所在的文件,为开发人员提供较多的便利。
所述元素的相关信息还可包括所述元素的名称,所述元素的名称在所述预设协议包括所述注解编写在所述元素的声明之前时,从所述注解所编写的位置的下一行代码中获取得到。本申请实施例中,若预设协议中规定注解编写在所述元素的声明之前,由于元素的声明中都写有元素的名称,则元素的名称可以从所述注解所编写的位置的下一行代码中快速获取得到。
具体的,注解代码的识别可以是在源代码编写结束,且编译之前进行。上述识别过程,可以根据预设协议的具体规定,采用脚本语言预先编写相应的识别逻辑。在识别注解时调用该预先编写的脚本文件扫描全部源代码文件,最终可识别出源代码文件中的每个注解,并获得被注解元素的相关信息。可以理解的是,源代码文件中可以包括一个或多个注解,并且,每个元素也可以对应多个注解,这些被注解元素的相关信息都可以写入至同一个配置文件中。配置文件的具体格式可以根据实际的开发环境和开发需求而设定,例如可以是plist等格式的配置文件。
以下示出了配置文件中记载的被注解元素的一些相关信息。
上述示例中,第一行代码“@../Sources/ASAppDelegate.m”表示注解是从名为ASAppDelegate.m的源代码文件中识别出来的。
后续的以“@{”开头,及“},\”结束之间的代码,即表示一个注解及其所对应的元素的相关信息。上述示例中包括了2个注解所对应的元素的相关信息。
上述示例中示出的2个注解中,其元素的classname都为ASAppDelegate,其表示上述2个注解都编写在名为ASAppDelegate的类下,也即是2个注解都是ASAppDelegate类的相关信息。
上述示例仅以配置文件所记载的2个注解所对应的元素的相关信息为例进行说明,在实际应用中,配置文件中可以包括应用程序源代码中所有注解所对应的信息。
在生成配置文件后,可以将配置文件添加到源代码文件中进行编译,源代码文件中可以根据相关技术预先编写查询功能代码,将源代码编译后能获得应用程序,通过应用程序所提供的查询功能,当接收到对所述被注解元素的查询请求时,可以调用所述配置文件查询所述被注解元素的相关信息。
具体的,所述调用所述配置文件查询所述被注解元素的相关信息,包括:
获取所述查询请求中携带的查询对象的字符串。
在配置文件中,利用字符串匹配方式查找出包含有所述字符串的被注解元素的相关信息。
例如,仍以上述配置文件的示例进行说明,当开发人员需要查询有关ASAppDelegate类的相关信息时,可以输入“ASAppDelegate”,根据字符串“ASAppDelegate”,采用字符串匹配的方法,可以从配置文件查询到有2个注解所对应的元素的相关信息包含有该字符串“ASAppDelegate”,即可输出上述示例的2个注解所对应的信息,从而实现在不支持注解功能的编程语言中提供信息查询的能力。利用这些元素的相关信息,开发人员可以跟踪源代码中的依赖性或者检查代码等,因此可以为开发人员提供很多便利。
对应于上述的信息查询方法,如图2所示,是本申请根据一示例性实施例示出的一种终端的结构示意图。请参考图2,在硬件层面,该终端包括处理器、内部总线、网络接口、内存以及非易失性存储器,当然还可能包括其他业务所需要的硬件。处理器从非易失性存储器中读取对应的计算机程序到内存中然后运行,在逻辑层面上形成数据业务处理装置。当然,除了软件实现方式之外,本申请并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。
请参考图3,在软件实施方式中,该信息查询装置可以包括:注解识别模块31、信息获取模块32、文件生成模块33和信息查询模块34。其中:
注解识别模块31,用于从源代码中识别出元素的注解;其中,所述注解为所述源代码中按预设协议编写的代码。
信息获取模块32,用于根据所述注解获取所述元素的相关信息。
文件生成模块33,用于生成包含所述元素的相关信息的配置文件。
信息查询模块34,用于当接收到对所述元素的查询请求时,通过所述配置文件查询所述元素的相关信息。
在一个可选的实现方式中,所述预设协议包括以下一种或多种协议:
所述注解按注释格式编写、所述注解中包括预设的注解标识、所述注解编写在所述元素的声明之前或所述注解编写在一行代码中。
在一个可选的实现方式中,所述预设协议还包括:所述注解中包括所述元素的属性信息,所述注解中包括预设的属性标识;
所述元素的相关信息包括所述元素的属性信息。
在一个可选的实现方式中,所述元素的相关信息还包括源代码文件名,所述源代码文件名通过读取编写有所述注解的源代码文件的名称而获得。
在一个可选的实现方式中,所述元素的相关信息还包括所述元素的名称,所述元素的名称在所述预设协议包括所述注解编写在所述元素的声明之前时,从所述注解所编写的位置之后的下一行代码中获取得到。
在一个可选的实现方式中,所述信息查询模块24,包括:
字符串获取子模块(图3未示出),用于获取所述查询请求中携带的字符串;
信息查询子模块(图3未示出),用于在所述配置文件中,利用字符串匹配的方式查找出包含所述字符串的所述元素的相关信息。
上述装置中各个模块的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
本领域技术人员在考虑说明书及实践这里申请的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未申请的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求指出。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制。
以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。