使用[]在Groovy中访问对象属性

13

假设我有以下 Groovy 代码:

class Human {
  Face face
}
class Face {
  int eyes = 2
}
def human = new Human(face:new Face())

我想使用[]访问eyes属性:

def humanProperty = 'face.eyes'
def value = human[humanProperty]

但是这并没有像我期望的那样工作(因为它试图在Human对象上访问一个名为'face.eyes'的属性,而不是human.face属性中的eyes属性)。

还有其他的方法吗?

2个回答

16

你需要评估这个字符串来获取所需的属性。为此,你可以采用以下方法之一:

humanProperty.split( /\./ ).inject( human ) { obj, prop -> obj?."$prop" }
(将humanProperty分成属性名称的列表,然后从human对象开始,依次调用每个属性,并将结果传递给下一次迭代。
或者,你可以使用Eval类来做类似这样的事情:)
Eval.x( human, "x.${humanProperty}" )
使用[]符号,你需要进行以下操作:
human[ 'face' ][ 'eyes' ]

1
一个更简单的方法是只需执行以下命令:
def value = human['face']['eyes']

但是如果您不知道所需的值(“face”和“eyes”),还有一种更简单、更清晰的方法。

def str = "face.eyes"
def values = str.split("\\.")
def value = human[values[0]][values[1]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接