可以在Groovy中获取变量名吗?

可以在Groovy中获取变量名吗?,groovy,metaprogramming,katalon-studio,Groovy,Metaprogramming,Katalon Studio,我想知道是否可以检索变量的名称 例如,如果我有一个方法: def printSomething(def something){ //instead of having the literal String something, I want to be able to use the name of the variable that was passed println('something is: ' + something) } 如果我按如下方式调用此方法: def ordinary

我想知道是否可以检索变量的名称

例如,如果我有一个方法:

def printSomething(def something){
//instead of having the literal String something, I want to be able to use the name of the variable that was passed
println('something is: ' + something)
}
如果我按如下方式调用此方法:

 def ordinary = 58
 printSomething(ordinary)
我想得到:

ordinary is 58
extraOrdinary is 67
另一方面,如果我这样调用此方法:

def extraOrdinary = 67
printSomething(extraOrdinary)
我想得到:

ordinary is 58
extraOrdinary is 67
编辑

我需要变量名,因为我在Katalon Studio中的每个TestSuite之前都有一段代码,基本上它让您可以灵活地使用Katalon.features文件传递全局变量。这个想法来自:

现在它只处理1个变量值,如果我对20个变量这样做,这是大量重复的代码,所以我想创建一个助手函数:

def setProperty(KatalonProperties props, GlobalVariable var){
   WebUI.comment(">>> " + var.getName()" + default value: \'${var}\'");

//gets the internal value of var, if it's null then use the one from katalon.features file
            GlobalVariable preferedVar = props.getProperty(var.getName())
            if (preferedVar != null) {
                var = preferedVar;
                WebUI.comment(">>> " + var.getName() + " new value: \'${preferedVar}\'");
            } else {
                WebUI.comment(">>> " + var.getName() + " stays unchanged");
            }
}

在这里,我只是用var.getName()来解释我所寻找的,这只是我假设的一种方法。

不,这是不可能的

但是,请考虑使用map作为参数并传递属性的名称和值:

def printSomething(Map m){
    println m
}

printSomething(ordinary:58)
printSomething(extraOrdinary:67)
printSomething(ordinary:11,extraOrdinary:22)
这将输出

[ordinary:58]
[extraOrdinary:67]
[ordinary:11, extraOrdinary:22]

是的,这可以通过ASTTransformations或宏(Groovy 2.5+)实现

我目前没有合适的开发环境,但这里有一些建议:

并不是说这两个选项都很重要,也不是我推荐给Groovy新手的,您需要做一些研究。如果我没记错的话,这两个选项都需要从调用代码中分离出一个构建/项目才能可靠地工作。此外,它们中的任何一个都可能给您带来晦涩难懂且难以调试的编译时错误,例如,当您的代码需要一个变量作为参数,但传递了一个文本或方法调用时。所以:有龙。也就是说:我在这些方面做了很多工作,它们真的很有趣;)

如果您使用的是Groovy 2.5+,那么可以使用宏。对于您的用例,请查看
@宏方法
部分。您的方法将有两个参数:
MacroContext MacroContext,MethodCallExpression callExpression
后者是一个有趣的参数。具有
getArguments()
-方法,允许您访问作为参数传递给方法的抽象语法树节点。在您的情况下,它应该是一个具有
getName()
方法的函数,该函数可以为您提供所需的名称


这是更复杂的版本。您仍然可以使用与宏方法相同的
VariableExpression
,但是由于您必须自己识别正确的
methodCalleExpression
,因此使用该方法将非常繁琐。您从
类节点开始
,然后自己处理
变量表达式
。我建议使用局部转换并创建注释。但是识别正确的
MethodCallExpression
并不是一件小事。

@Carcigenicate这不是纯粹出于好奇,我需要使用变量名将其传递给函数:
KatalonProperties.getProperty(String key)
,它根据属性名检索属性值。我可以将参数改为字符串而不是def来控制传递给函数的内容……但我仍然需要知道如何获取variableNo的名称,事实并非如此possible@tim_yates好吧,这是一个令人沮丧的问题:(@AdityaT不认为它是重复的。这是关于获取参数名称。这是关于获取传递给method@tim_yate对于宏方法来说,这不可能吗?或者我在这里错了吗?对于我的专业水平来说,这听起来太多了:(并非有意让您气馁:/但是最好先学习基础知识,然后再回来。Groovy非常强大,当您开始使用AST时,它会变得更加强大;)回答错误。有可能得到变量的名称。抱歉,伙计,我实际上误解了这个问题,对吗?我不确定这是否可能。D:你能编辑答案来澄清这一点吗?方法参数是可能的,变量名称是不可能的@AdityaT如果方法参数是可能的,那么我也可以使用它。好的,我将添加一个答案。@AdityaT期待您的答案。