2010-11-02 276 views
11

說我有在常規下面的代碼:訪問對象屬性[]

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屬性)。

是否有另一種方式做到這一點?

回答

14

您需要評估字符串以獲取所需的屬性。要做到這一點,你可以這樣做:

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

(即拆分humanProperty到屬性名稱的列表,然後,開始與human對象,依次調用每個屬性,結果傳遞給下一次迭代。

或者,你可以使用Eval類做這樣的事情:

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

要使用[]符號,你需要做的:

human[ 'face' ][ 'eyes' ] 
+0

謝謝,我會試一試 – Valdemar 2010-11-02 13:20:13

1

更簡單的方法是簡單地執行:

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

但是,如果你不知道需要(「面子」和「眼睛」)的值,這裏還有一個更簡單,更清晰的方式。

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