如何在groovy中获取以另一个变量命名的变量的值?

How can I get the value of a variable named after another one in groovy?

我有一个变量,其中包含另一个要检索值的变量的名称,例如:

1
2
def variable ="finalVariableValue"
def variableName ="variable"

如何获取variable.value,因为我只知道variablename?

我已经看到可以使用a绑定,但是我有很多变量需要放在这个绑定对象上才能使其正常工作。唯一的办法是?

注意:这种行为实际上类似于Ant属性扩展机制。

谢谢,米歇尔。


通过在def前加前缀,你不需要在一个对象中注册它,你可以像地图一样检查它;可以说它在ast中注册了,但那是一条崎岖的道路。

我的0.03正在使用地图、绑定或动态属性。删除def部分,选择其中一个解决方案:

地图

只需将EDOCX1[2]声明为映射中的键:

1
2
3
4
5
def map = [:]
map.variable ="finalVariableValue"
def variableName ="variable"

assert map[variableName] =="finalVariableValue"

绑定(带脚本)

使用脚本内置绑定。注意:这只适用于脚本:

1
2
3
4
variable ="finalVariableValue"
variableName ="variable"

assert binding[variableName] =="finalVariableValue"

动态特性

使用一些动态属性机制,如Expando(也可以使用getPropertysetProperty等):

1
2
3
4
5
6
7
8
9
10
11
class Container extends Expando {
    def declare() {
        variable ="finalVariableValue"
        variableName ="variable"
    }
}

c = new Container()
c.declare()

assert c[c.variableName] =="finalVariableValue"


您可以使用脚本的作用域,只需删除Type定义:

1
2
3
4
5
variable = 'value'
name = 'variable'

assert 'variable' == this.name
assert 'value' == this[this.name]

或使用@Field注释:

1
2
3
4
5
6
7
import groovy.transform.Field

@Field def variable = 'value'
@Field def name = 'variable'

assert 'variable' == this.name
assert 'value' == this[this.name]