使用[]访问groovy中的对象属性

时间:2010-11-02 11:28:59

标签: groovy

说我在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 个答案:

答案 0 :(得分:15)

您需要评估字符串以获取所需的属性。为此,您可以这样做:

humanProperty.split( /\./ ).inject( human ) { obj, prop -> obj?."$prop" }

(将humanProperty拆分为属性名称列表,然后从human对象开始依次调用每个属性,将结果传递给下一次迭代。

或者,您可以使用Eval类执行以下操作:

Eval.x( human, "x.${humanProperty}" )

要使用[]表示法,您需要执行以下操作:

human[ 'face' ][ 'eyes' ]

答案 1 :(得分:1)

更简单的方法是简单地执行:

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

但如果你不知道所需的值('face'和'eyes'),那么也会有一种更容易和更清晰的方式。

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