2010-11-02 4 views
11

Dire que j'ai le code suivant dans groovy:propriétés d'objet d'accès à groovy à l'aide de []

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

Je veux accéder à la propriété eyes utilisant le []:

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

Mais cela ne fonctionne pas comme je m'y attendais (car cela essaie d'accéder à une propriété nommée 'face.eyes' sur l'objet humain, pas à la propriété eyes sur la propriété human.face).

Existe-t-il une autre façon de procéder?

Répondre

14

Vous devez évaluer la chaîne pour accéder à la propriété dont vous avez besoin. Pour ce faire, vous pouvez faire:

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

(qui divise la humanProperty dans une liste de noms de propriétés, puis, en commençant par l'objet human, appelle chaque propriété à son tour, en passant le résultat à l'itération suivante.

Ou, vous pouvez utiliser la classe Eval pour faire quelque chose comme:

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

pour utiliser la notation [], vous devez faire:

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

Merci, je vais essayer – Valdemar

1

Une façon plus facile serait d'exécuter simplement:

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

Mais si vous ne connaissez pas les valeurs requises (« visage » et « yeux »), il y a aussi une façon plus simple et plus claire.

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