说我在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属性)。
还有其他办法吗?
答案 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]]