CN108628635B - 获取参数名和局部变量名的方法、装置、设备及存储介质 - Google Patents

获取参数名和局部变量名的方法、装置、设备及存储介质 Download PDF

Info

Publication number
CN108628635B
CN108628635B CN201810426003.XA CN201810426003A CN108628635B CN 108628635 B CN108628635 B CN 108628635B CN 201810426003 A CN201810426003 A CN 201810426003A CN 108628635 B CN108628635 B CN 108628635B
Authority
CN
China
Prior art keywords
name
local variable
parameter
annotation
class
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
CN201810426003.XA
Other languages
English (en)
Other versions
CN108628635A (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.)
Guangzhou Shiyuan Electronics Thecnology Co Ltd
Guangzhou Shirui Electronics Co Ltd
Original Assignee
Guangzhou Shiyuan Electronics Thecnology Co Ltd
Guangzhou Shirui Electronics 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 Guangzhou Shiyuan Electronics Thecnology Co Ltd, Guangzhou Shirui Electronics Co Ltd filed Critical Guangzhou Shiyuan Electronics Thecnology Co Ltd
Priority to CN201810426003.XA priority Critical patent/CN108628635B/zh
Publication of CN108628635A publication Critical patent/CN108628635A/zh
Application granted granted Critical
Publication of CN108628635B publication Critical patent/CN108628635B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/74Reverse engineering; Extracting design information from source code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种获取参数名和局部变量名的方法、装置、设备及存储介质。包括:解析源代码中的注解标记并修改源代码,修改后的源代码的预设代码行添加有识别标记;通过反射机制获取修改后的源代码中类的成员函数参数名;运行修改后的源代码获取局部变量名。本方法通过在源代码中添加入自定义注解,可以兼容Java5以上的各个版本,实现对参数名和局部变量的获取。本方法可以防止字节码变大,极大的降低获取参数名和局部变量名的难度,同时提高了编译器处理速率。

Description

获取参数名和局部变量名的方法、装置、设备及存储介质
技术领域
本发明实施例涉及代码编译技术,尤其涉及一种获取参数名和局部变量名的方法、装置、设备及存储介质。
背景技术
Java语言是一种解释型语言。Java源代码经过编译,生成java指令文件,所生成的java指令文件在Java虚拟机中解释执行。
在Java的编译和测试过程中,通常需要获取Java变量名称。目前主要有两种获得Java变量名称的方式。一种是针对Java8,可通过使用–parameters参数编译为class文件后,保留参数名字,然后通过反射的方式获取参数名。一种是除Java8以外的版本,只用有在编译时使用了-g或-g:vars参数生成了调试信息,在class文件中才会生成方法参数名信息(在本地变量表LocalVariableTable中),但还要通过字节码分析工具才能拿到参数信息。
在实现本发明的过程中,发明人发现现有技术中至少存在如下问题:获取Java参数名和局部变量名时,需要引入字节码分析库,先对字节码进行操作才能拿到参数信息,操作复杂,而且对效率会有很大影响。
发明内容
本发明提供一种获取参数名和局部变量名的方法、装置、设备及存储介质,以实现兼容Java6、Java7和Java8等多个版本,同时在不引入字节码分析库的情况下获得Java中的参数名和局部变量名。
第一方面,本发明实施例提供了一种获取参数名和局部变量名的方法,包括:
解析源代码中的注解标记并修改源代码,修改后的源代码的预设代码行添加有识别标记;
通过反射机制获取修改后的源代码中类的成员函数参数名;
运行修改后的源代码获取局部变量名。
第二方面,本发明实施例还提供了一种获取参数名和局部变量名的装置,包括:
代码解析模块,用于解析源代码中的注解标记并修改源代码,修改后的源代码的预设代码行添加有识别标记;
参数名获取模块,用于通过反射机制获取修改后的源代码中类的成员函数参数名;
局部变量获取模块,用于运行修改后的源代码获取局部变量名。
第三方面,本发明实施例还提供了一种设备,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如上述实施例中任一所述的获取参数名和局部变量名的方法。
第四方面,一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如上述实施例中任一所述的获取参数名和局部变量名的方法。
本发明通过使用第一注解字段,解决了获取参数名和局部变量名时,需要引入字节码分析库,先对字节码进行操作才能拿到参数信息的问题,实现兼容多个Java版本获取Java的参数名和局部变量名。
附图说明
图1是本发明实施例一提供的一种获取参数名和局部变量名的方法的流程图;
图2为本发明实施例二提供的一种获取参数名和局部变量名的方法的流程图;
图3为本发明实施例三提供的一种获取参数名和局部变量名的装置的结构示意图;
图4为本发明实施例四提供的一种设备的结构示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
实施例一
图1是本发明实施例一提供的一种获取参数名和局部变量名的方法的流程图。本实施例可用于各个Java版本,同时需要使用注解处理器(Annotation Processor)。该方法可以由一种获取参数名和局部变量名的装置来执行,该装置可以通过软件的方式实现,并集成在设备中。
其中,注解处理器是javac的一个工具,用来在编译时扫描和编译和处理注解,该注解处理器是官方提供的功能,从Java5开始有这个功能。JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型。该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的class文件和一个注解处理工具组成。注解并不直接影响代码的语义,但是他可以被看作是程序的工具或者类库。它会反过来对正在运行的程序语义有所影响。注解以源文件、class文件或者在运行时通过反射机制多种方式被读取。各个Java版本通常指Java5以上的版本。
参考图1,本发明实施例具体包括如下步骤:
S110、解析源代码中的注解标记并修改源代码,修改后的源代码的预设代码行添加有识别标记。
其中,源代码也称源程序,是一系列人类可读的计算机语言指令。注解标记是编写源代码过程中人为加入的一个自定义注释,本发明中以加入一个名为@Param的自定义注解为例,会在后续实施例中对该注解进行详细描述。但本发明不以名为@Param的自定义注解为限,所有可以完成或者包括该自定义注解功能的其他自定义注解也在本发明的保护范围内。修改源代码是指基于添加的自定义注解,对源代码进行修改。预设代码行是指基于添加的自定义注解修改的源代码的所在行。识别标记是指修改源代码后,存在于修改后的源代码中预设代码行位置的识别标记,一般可以与自定义注解同名,如通过名为@Param的自定义注解修改后的预设代码行的识别标记可以同样为“@Param”这个名字。
具体的,编程过程中,在源代码中的类、类的成员函数或成员函数的参数位置加上注解标记,解析源代码中的注解标记,并根据设定的注解标记的内容修改源代码。源代码被修改的位置被称为预设代码行,所述预设代码行添加有识别标记,表示该源代码相应位置已经做修改。
S120、通过反射机制获取修改后的源代码中类的成员函数参数名。
其中,Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。类的成员函数是一个类里面所有定义的函数。
具体的,注解可以通过反射获取。首先可以通过Class对象的isAnnotationPresent()方法判断它是否应用了某个注解,然后通过getAnnotation()方法来获取Annotation对象;或者是通过getAnnotations()方法来获取Annotation对象。前一种方法返回指定类型的注解,后一种方法返回注解到这个元素上的所有注解。
S130、运行修改后的源代码获取局部变量名。
其中,局部变量是指在程序中只在特定过程或函数中可以访问的变量,局部变量是相对于全局变量而言的。在Java等面向对象语言中,也可能出现多个局部变量重名的情况。
具体的,运行解析源代码中的注解标记并被修改源代码,获取局部变量名。
在此基础上,本实施例中的S120与S130步骤之间没有时序关系,若只需要获得源代码中的参数名,可以选择执行S110与S120步骤;若只需要获取局部变量名,可以选择执行S110与S130步骤。
本发明实施例通过在源代码中添加入自定义注解,可以兼容Java5以上的各个版本,实现对参数名和局部变量的获取。本方法可以防止字节码变大,极大的降低获取参数名和局部变量名的难度,同时提高了编译器处理速率。
实施例二
图2为本发明实施例二提供的一种获取参数名和局部变量名的方法的流程图。本实施例是在上述实施例的基础上进行的细化。具体的:
解析源代码中的注解标记并修改源代码之前,还包括:
接收第一注解字段,所述第一注解字段对应于源代码中的类、类的成员函数或成员函数的参数;
在已加入第一注解字段的类的成员函数中,声明第一局部变量并加入变量名获取语句。
解析源代码中的注解标记并修改源代码,具体包括:
创建一个实现AbstractProcessor的接口的类,用于获取待解析的Java源文件;
使用JDK提供的tools.jar包中的ASTParser类,根据Java源文件生成抽象语法树;
通过抽象语法树,搜索第一注解字段标记,并通过抽象语法树修改成员函数的参数;
通过抽象语法树,搜索变量名获取语句语句,并修改该语句中所使用的参数。
通过反射机制获取修改后的源代码中类的成员函数参数名,具体包括:
通过反射获取第一注解字段的信息;
输出第一注解字段中的名称属性,所述名称属性为所需的成员函数参数名或局部变量名。
在此基础上,还对其中两个步骤进行进一步细化,具体的:
过抽象语法树修改成员函数的参数,具体包括:
若第一注解字段标记附加在成员函数的参数上,则通过所述抽象语法树,获取所述参数的参数名字符串,对所述参数增加第二注解字段;
若第一注解字段标记附加在成员函数上,通过抽象语法树,遍历所述成员函数的全部参数,获取所述参数名字符串,对所述参数增加第二注解字段;
若第一注解字段标记附加在类上,则对所述类包括的所有的方法增加第二注解字段。
搜索变量名获取语句,并修改该语句中所使用的参数,具体包括:
获取第一局部变量的变量名字符串;
通过抽象语法树,替换变量名获取语句中的Object类型的第一局部变量为String类型的第一局部变量参数。
所述第一局部变量为Object类型的局部变量。
参考图2,本实施例提供的具体方法包括:
S210、接收第一注解字段。
其中,第一注解字段为解字段@Param。注解字段@param是参数的解释。如:/***@param s这里表示对s的文字说明,描述*/public void aa(String s){}一般java中@表示注解,解释一个方法,类,属性的作用。
具体的,接收注解字段@Param。编译器接收写入的注解字段@Param,并在检索到@Param时执行响应操作。
S220、在已加入第一注解字段的类的成员函数中,声明第一局部变量并加入变量名获取语句。
其中,第一局部变量为var,变量名获取语句为ParamUtil.getVarName(var)。类的成员函数包含参数的参数名和函数的局部变量名的信息。局部变量的作用域仅限于定义它的方法,在该方法的外部无法访问它。成员变量的作用域在整个类内部都是可见的,所有成员方法都可以使用它。如果访问权限允许,还可以在类的外部使用成员变量。局部变量的生存周期与方法的执行期相同。当方法执行到定义局部变量的语句时,局部变量被创建;执行到它所在的作用域的最后一条语句时,局部变量被销毁。类的成员变量,如果是实例成员变量,它和对象的生存期相同。而静态成员变量的生存期是整个程序运行期。在同一个方法中,不允许有同名的局部变量。在不同的方法中,可以有同名的局部变量,它们互不干涉。局部变量可以和成员变量同名,且在使用时,局部变量具有更高的优先级。语句ParamUtil.getVarName(var)是对getVarName的参数进行替换。
例如:
Figure BDA0001652103760000081
会替换成
Figure BDA0001652103760000082
Figure BDA0001652103760000091
具体的,在类或函数的申明语句前、参数名前或局部变量的申明语句后加入注解字段@Param,同时声明局部变量var并加入语句ParamUtil.getVarName(var)。
S230、创建一个实现AbstractProcessor的接口的类,用于获取待解析的Java源文件。
其中,继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。接口实现:接口实现在java中是一种特殊继承方式,接口在定义后,就可以在类中实现该接口,在类中实现接口可以使用关键字implement。待解析的Java源文件是指含有@param注解字段的源代码。
具体的,创建一个类实现AbstractProcessor的接口,这个是可以通过继承process方法拿到对应的.java的文件。
S240、使用JDK提供的tools.jar包中的ASTParser类,根据Java源文件生成抽象语法树。
其中,JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的Java应用程序。JDK是整个Java开发的核心,它包含了Java的运行环境(JVM+Java系统类库)和Java工具。ASTParser是AST语法树的解析器,创建该实体的时候需要传递一个参数来描述解析的JDK版本。
具体的,对.java文件进行分析,使用jdk里的一个名为tools.jar包中的工具生成抽象语法树,再通过对抽象语法树的遍历可以搜索到@Param注解的所在。
S250、通过抽象语法树,搜索第一注解字段标记,并通过抽象语法树修改成员函数的参数。
其中,抽象语法树是使用树状结构来表示源代码的抽象语法结构,树上的每一个节点都对应源代码中的一种结构,它作为程序代码的一种中间表示形式,在代码分析、代码重构、语言翻译等领域得到广泛的应用。现有的一些相关工具中,都会存在自行将源代码转换为抽象语法树的模块。至于将哪些语法节点进行转换,不同的工具会有不同的定义。搜索@Param标记是指通过遍历的方式搜索注解字段@Param。通过抽象语法树修改成员函数的参数,具体包括:若@Param标记附加在成员函数的参数上,则通过所述抽象语法树,获取所述参数的参数名字符串记为paramName,对所述参数增加注解@Param(paramName);若@Param标记附加在成员函数上,通过抽象语法树,遍历所述成员函数的全部参数,获取所述参数名字符串记为paramName,对所述参数增加注解@Param(paramName);若@Param标记附加在类上,则对所述类包括的所有的方法增加注解@Param(paramName)。
具体的,如果搜索出的是一个方法上面有@Param的标注,将对这个方法的参数进行处理。这时候因为是对源文件进行的分析,因此是可以拿到参数名的。对抽象语法树的遍历不仅可以查询到源文件里面的信息,还可以对这个抽象语法树进行修改,生成新的源文件。通过修改语法树,对所有方法的参数加上注解,@Param(“参数名”)。
例如:
Figure BDA0001652103760000111
会替换成
Figure BDA0001652103760000112
如果搜索出的是一个类上面有@Param的标注,将对这个类下面所有的方法进行上述的操作。如果搜索出的是一个方法参数上面有@Param标注,则只对这个方法参数进行上述操作。
S260、通过抽象语法树,搜索变量名获取语句语句,并修改该语句中所使用的参数。
其中,搜索ParamUtil.getVarName(var)语句,并修改该语句中所使用的参数,具体包括:获取局部变量var的变量名字符串,记为varName;通过抽象语法树,替换ParamUtil.getVarName(var)的Object类型的参数var为String类型的参数varName。
具体的,如果搜索出的一个局部变量有@Param标注,方案提供一个方法通过调用这个方法,传入局部变量即可获取到局部变量的名称。局部变量的名字获取和方法里面的参数的名字获取不一样。方法里面的参数是通过@Param去标注的,局部变量的方法是通过ParamUtil.getVarName去标注的,注解处理器同样要扫描这个方法,然后替换掉这个方法里面的参数,从而替换成字符串。获取局部变量的方法只是简单的返回传入的参数就可以了,因为局部变量已经变成字符串返回了。
例如:
String getVarName(Object var){
return(String)var;
}
S270、通过反射获取第一注解字段的信息。
具体的,通过抽象语法树修改后的语句已经把参数名存在了字节码里面,可以直接通过反射操作获取参数名。
S280、输出第一注解字段中的名称属性,所述名称属性为所需的成员函数参数名或局部变量名。
其中,第一注解字段中的名称属性@Param中的Name属性,所述Name属性为所需的成员函数参数名或局部变量名。
具体的,运行修改后的源代码,同时输出@Param中的Name属性,所述Name属性即为所需要获取的参数名和局部变量名。
本发明实施例通过在源代码中添加入自定义注解,可以兼容Java5以上的各个版本,实现对参数名和局部变量的获取。本方法不使用修改编译参数的方式,从而避免了增加了框架使用操作。同时通过使用注解处理器,只要依赖jar包即可实现获取参数名的功能。从而即减少了获取参数名和局部变量名的工作量,又可以防止字节码变大,极大的降低获取参数名和局部变量名的难度,同时提高了编译器处理速率。
实施例三
图3为本发明实施例三提供的一种获取参数名和局部变量名的装置的结构示意图。该装置具体包括:代码解析模块31、参数名获取模块32和局部变量获取模块33。
代码解析模块31,用于解析源代码中的注解标记并修改源代码,修改后的源代码的预设代码行添加有识别标记;
参数名获取模块32,用于通过反射机制获取修改后的源代码中类的成员函数参数名;
局部变量获取模块33,用于运行修改后的源代码获取局部变量名。
本发明实施例通过在源代码中添加入自定义注解,可以兼容Java5以上的各个版本,实现对参数名和局部变量的获取。本方法不使用修改编译参数的方式,从而避免了增加了框架使用操作。同时通过使用注解处理器,只要依赖jar包即可实现获取参数名的功能。从而即减少了获取参数名和局部变量名的工作量,又可以防止字节码变大,极大的降低获取参数名和局部变量名的难度,同时提高了编译器处理速率。
在上述实施例的基础上,还包括:
注解字段接收模块,用于接收第一注解字段,所述第一注解字段对应于源代码中的类、类的成员函数或成员函数的参数;
局部变量申明模块,用于在已加入第一注解字段的类的成员函数中,声明第一局部变量并加入变量名获取语句。
在上述实施例的基础上,还包括:
变量申明模块,用于申明第一局部变量为Object类型的局部变量。
在上述实施例的基础上,代码解析模块31还包括:
接口创建单元,用于创建一个实现AbstractProcessor的接口的类,用于获取待解析的Java源文件;
抽象语法树生成单元,用于使用JDK提供的tools.jar包中的ASTParser类,根据Java源文件生成抽象语法树;
成员函数修改单元,用于通过抽象语法树,搜索第一注解字段标记,并通过抽象语法树修改成员函数的参数;
特定语句修改单元,用于通过抽象语法树,搜索变量名获取语句,并修改该语句中所使用的参数。
在上述实施例的基础上,参数名获取模块32还包括:
反射机制执行单元,用于通过反射获取第一注解字段的信息;
属性输出单元,用于输出第一注解字段中的名称属性,所述名称属性为所需的成员函数参数名或局部变量名。
在上述实施例的基础上,所述成员函数修改单元还用于:
若第一注解字段标记附加在成员函数的参数上,则通过所述抽象语法树,获取所述参数的参数名字符串,对所述参数增加第二注解字段;
若第一注解字段标记附加在成员函数上,通过抽象语法树,遍历所述成员函数的全部参数,获取所述参数名字符串,对所述参数增加第二注解字段;
若第一注解字段标记附加在类上,则对所述类包括的所有的方法增加第二注解字段。
在上述实施例的基础上,所述特定语句修改单元还用于:获取第一局部变量的变量名字符串;
通过抽象语法树,替换变量名获取语句中的Object类型的第一局部变量为String类型的第一局部变量参数。
本实施例提供的获取参数名和局部变量名装置可用于执行上述任一实施例提供的获取参数名和局部变量名方法,具有相应的功能和有益效果。
实施例四
图4为本发明实施例四提供的一种设备的结构示意图。如图4所示,该设备包括处理器40、存储器41、通信模块42、输入装置43和输出装置44;设备中处理器40的数量可以是一个或多个,图4中以一个处理器40为例;设备中的处理器40、存储器41、通信模块42、输入装置43和输出装置44可以通过总线或其他方式连接,图4中以通过总线连接为例。
存储器41作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本实施例中的一种获取参数名和局部变量名的方法对应的模块(例如,一种获取参数名和局部变量名装置中的代码解析模块31、参数名获取模块32和局部变量获取模块33)。处理器40通过运行存储在存储器41中的软件程序、指令以及模块,从而执行设备的各种功能应用以及数据处理,即实现上述的一种获取参数名和局部变量名的方法。
存储器41可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据设备的使用所创建的数据等。此外,存储器41可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器41可进一步包括相对于处理器40远程设置的存储器,这些远程存储器可以通过网络连接至设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
通信模块42,用于与显示屏建立连接,并实现与显示屏的数据交互。输入装置43可用于接收输入的数字或字符信息,以及产生与设备的用户设置以及功能控制有关的键信号输入。输出装置44可包括如显示屏等其他可用于输出的装置。
本实施例提供的一种设备,可执行本发明任一实施例提供的获取参数名和局部变量名的方法,具体相应的功能和有益效果。
实施例五
本发明实施例五还提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行一种获取参数名和局部变量名的方法,该方法包括:
解析源代码中的注解标记并修改源代码,修改后的源代码的预设代码行添加有识别标记;
通过反射机制获取修改后的源代码中类的成员函数参数名;
运行修改后的源代码获取局部变量名。
当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的方法操作,还可以执行本发明任一实施例所提供的获取参数名和局部变量名的方法中的相关操作。
通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(RandomAccess Memory,RAM)、闪存(FLASH)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
值得注意的是,上述获取参数名和局部变量名的装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

Claims (8)

1.一种获取参数名和局部变量名的方法,其特征在于,包括:
解析源代码中的注解标记并修改源代码,修改后的源代码的预设代码行添加有识别标记;
通过反射机制获取修改后的源代码中类的成员函数参数名;
运行修改后的源代码获取局部变量名;
其中,所述解析源代码中的注解标记并修改源代码,包括:
创建一个实现AbstractProcessor的接口的类,用于获取待解析的Java源文件;
使用JDK提供的tools.jar包中的ASTParser类,根据Java源文件生成抽象语法树;
通过抽象语法树,搜索第一注解字段标记,并通过抽象语法树修改成员函数的参数;
通过抽象语法树,搜索变量名获取语句,并修改该语句中所使用的参数;
其中,所述搜索变量名获取语句,并修改该语句中所使用的参数,包括:
获取第一局部变量的变量名字符串;
通过抽象语法树,替换变量名获取语句中的Object类型的第一局部变量为String类型的第一局部变量参数;
其中,所述第一局部变量的名称为无法直接获取的变量名称。
2.根据权利要求1所述的方法,其特征在于,所述解析源代码中的注解标记并修改源代码之前,还包括:
接收第一注解字段,所述第一注解字段对应于源代码中的类、类的成员函数或成员函数的参数;
在已加入第一注解字段的类的成员函数中,声明第一局部变量并加入变量名获取语句。
3.根据权利要求1所述的方法,其特征在于,所述通过反射机制获取修改后的源代码中类的成员函数参数名,具体包括:
通过反射获取第一注解字段的信息;
输出第一注解字段中的名称属性,所述名称属性为所需的成员函数参数名或局部变量名。
4.根据权利要求1所述的方法,其特征在于,所述通过抽象语法树修改成员函数的参数,具体包括:
若第一注解字段标记附加在成员函数的参数上,则通过所述抽象语法树,获取所述参数的参数名字符串,对所述参数增加第二注解字段;
若第一注解字段标记附加在成员函数上,通过抽象语法树,遍历所述成员函数的全部参数,获取所述参数名字符串,对所述参数增加第二注解字段;
若第一注解字段标记附加在类上,则对所述类包括的所有的方法增加第二注解字段。
5.根据权利要求2所述方法,其特征在于,所述第一局部变量为Object类型的局部变量。
6.一种获取参数名和局部变量名的装置,其特征在于,包括:
代码解析模块,用于解析源代码中的注解标记并修改源代码,修改后的源代码的预设代码行添加有识别标记;
参数名获取模块,用于通过反射机制获取修改后的源代码中类的成员函数参数名;
局部变量获取模块,用于运行修改后的源代码获取局部变量名;
其中,所述代码解析模块,包括:
接口创建单元,用于创建一个实现AbstractProcessor的接口的类,用于获取待解析的Java源文件;
抽象语法树生成单元,用于使用JDK提供的tools.jar包中的ASTParser类,根据Java源文件生成抽象语法树;
成员函数修改单元,用于通过抽象语法树,搜索第一注解字段标记,并通过抽象语法树修改成员函数的参数;
特定语句修改单元,用于通过抽象语法树,搜索变量名获取语句,并修改该语句中所使用的参数;
其中,所述特定语句修改单元,还用于:
获取第一局部变量的变量名字符串;
通过抽象语法树,替换变量名获取语句中的Object类型的第一局部变量为String类型的第一局部变量参数;
其中,所述第一局部变量的名称为无法直接获取的变量名称。
7.一种设备,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-5中任一所述的获取参数名和局部变量名的方法。
8.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-5中任一所述的获取参数名和局部变量名的方法。
CN201810426003.XA 2018-05-07 2018-05-07 获取参数名和局部变量名的方法、装置、设备及存储介质 Active CN108628635B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810426003.XA CN108628635B (zh) 2018-05-07 2018-05-07 获取参数名和局部变量名的方法、装置、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810426003.XA CN108628635B (zh) 2018-05-07 2018-05-07 获取参数名和局部变量名的方法、装置、设备及存储介质

Publications (2)

Publication Number Publication Date
CN108628635A CN108628635A (zh) 2018-10-09
CN108628635B true CN108628635B (zh) 2021-12-14

Family

ID=63695518

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810426003.XA Active CN108628635B (zh) 2018-05-07 2018-05-07 获取参数名和局部变量名的方法、装置、设备及存储介质

Country Status (1)

Country Link
CN (1) CN108628635B (zh)

Families Citing this family (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110069243B (zh) * 2018-10-31 2023-03-03 上海奥陶网络科技有限公司 一种java程序线程优化方法
CN111124484B (zh) * 2018-10-31 2023-09-01 上海奥陶网络科技有限公司 一种java程序参数优化方法
CN109976761B (zh) * 2019-02-27 2022-06-07 平安科技(深圳)有限公司 软件开发工具包的生成方法、装置及终端设备
JP7031627B2 (ja) * 2019-03-13 2022-03-08 オムロン株式会社 解析装置、解析方法、及び解析プログラム
CN109947419B (zh) * 2019-03-29 2022-04-26 泰康保险集团股份有限公司 一种实现逻辑判断的方法及装置
CN110618927A (zh) * 2019-06-20 2019-12-27 北京无限光场科技有限公司 用于测试应用的方法和装置
CN110471694A (zh) * 2019-07-11 2019-11-19 平安普惠企业管理有限公司 注释信息处理方法、装置、计算机设备及存储介质
CN110489124B (zh) * 2019-07-12 2023-06-13 浙江口碑网络技术有限公司 源代码执行方法、装置、存储介质及计算机设备
CN110457013B (zh) * 2019-07-12 2023-11-17 创新先进技术有限公司 程序组件配置装置及方法
CN112416312B (zh) * 2019-08-22 2024-06-07 腾讯科技(深圳)有限公司 一种对象获取方法、装置及电子设备、存储介质
CN110990019B (zh) * 2019-11-20 2023-05-02 腾讯音乐娱乐科技(深圳)有限公司 一种Java类分析方法、装置、存储介质及电子设备
CN111190585B (zh) * 2019-12-12 2023-05-02 杭州安恒信息技术股份有限公司 基于字节码增强技术实现java模式匹配特性的方法
CN111338637B (zh) * 2020-02-26 2024-09-20 腾讯科技(深圳)有限公司 一种代码生成方法及装置
CN111736806A (zh) * 2020-05-14 2020-10-02 广州三七网络科技有限公司 控件注入方法、装置及终端设备
CN111796865B (zh) * 2020-06-28 2024-04-16 北京字节跳动网络技术有限公司 一种字节码文件修改方法、装置、终端设备及介质
CN111857811B (zh) * 2020-07-29 2023-09-22 湖南泛联新安信息科技有限公司 一种资源流图的构建方法
CN114064042A (zh) * 2020-07-31 2022-02-18 阿里巴巴集团控股有限公司 一种工程源码编译系统、方法及装置
CN112114810A (zh) * 2020-08-13 2020-12-22 浙江大搜车融资租赁有限公司 编译处理方法及装置
CN112256323A (zh) * 2020-10-28 2021-01-22 浪潮云信息技术股份公司 一种修改参数配置的方法
CN113326032A (zh) * 2021-06-04 2021-08-31 深圳前海微众银行股份有限公司 一种数据序列化方法及装置、设备、存储介质
CN117111904B (zh) * 2023-04-26 2024-05-28 领悦数字信息技术有限公司 用于将Web应用自动转换成无服务器函数的方法和系统

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106919370A (zh) * 2015-12-24 2017-07-04 北京国双科技有限公司 一种对象属性值的获取方法及装置
CN107145436A (zh) * 2016-03-01 2017-09-08 阿里巴巴集团控股有限公司 软件功能验证方法及装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10310874B2 (en) * 2016-06-18 2019-06-04 Lior Malka Formal objects and executors

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106919370A (zh) * 2015-12-24 2017-07-04 北京国双科技有限公司 一种对象属性值的获取方法及装置
CN107145436A (zh) * 2016-03-01 2017-09-08 阿里巴巴集团控股有限公司 软件功能验证方法及装置

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
java如何获取方法参数名;MikanMu;《https://blog.csdn.net/mhmyqn/article/details/47294485》;20150805;第1-4页 *
自己动手实现Java注解(Java Annotation in Action);ZkvIA;《https://blog.csdn.net/doc_sgl/article/details/50367083》;20151221;第1-4页 *

Also Published As

Publication number Publication date
CN108628635A (zh) 2018-10-09

Similar Documents

Publication Publication Date Title
CN108628635B (zh) 获取参数名和局部变量名的方法、装置、设备及存储介质
CN106462425B (zh) 使用复常量的方法和系统
JP5893038B2 (ja) ユーザ定義型のコンパイル時境界検査
US5680622A (en) System and methods for quickly detecting shareability of symbol and type information in header files
US8732674B1 (en) Revertable managed execution image instrumentation
Grimmer et al. Cross-language interoperability in a multi-language runtime
US7565364B1 (en) Annotation processor discovery
US20060031820A1 (en) Method for program transformation and apparatus for COBOL to Java program transformation
US20150242194A1 (en) System for Translating Diverse Programming Languages
US20090328016A1 (en) Generalized expression trees
US20070074185A1 (en) Identifier expressions
EP4113284A1 (en) Cross-platform code conversion method and device
Porkoláb Functional programming with C++ template metaprograms
Fritzson et al. Metamodelica–a symbolic-numeric modelica language and comparison to julia
Aslam Challenges and solutions in the design of a java virtual machine for resource constrained microcontrollers
Tsay A Code Generation Framework for Ptolemy II.
Bezzubikov et al. Automatic dynamic binary translator generation from instruction set description
Bubak et al. Creating Java to native code interfaces with Janet extension
Rodrigues et al. Aspect-oriented WebAssembly transformation
Husák et al. PeachPie: Mature PHP to CLI compiler
Erni et al. The Hacker’s Guide to javac
Baaij et al. Soosim: Operating system and programming language exploration
Nadera et al. The varying faces of a program transformation systems
Beevi et al. Enhancing flexibility and portability of Execution Preserving Language Transformation using Meta programming
Dalton et al. nAIT: A source analysis and instrumentation framework for nesC

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