Свойства объекта доступа в 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]

Но это не работает, как я ожидал (поскольку он пытается получить доступ к свойству с именем "face.eyes" на объекте Human, а не в качестве свойств глаза для свойства human.face).

Есть ли другой способ сделать это?

Ответ 1

Вам нужно будет оценить строку, чтобы получить требуемое свойство. Для этого вы можете:

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

(который разбивает humanProperty на список имен свойств, затем, начиная с объекта human, каждый раз вызывает каждое свойство, передавая результат на следующую итерацию.

Или вы можете использовать класс Eval, чтобы сделать что-то вроде:

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

Чтобы использовать нотацию [], вам нужно будет сделать:

human[ 'face' ][ 'eyes' ]

Ответ 2

Более простой способ - просто выполнить:

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

Но если вы не знаете требуемых значений ( "лицо" и "глаза" ), также проще и понятнее.

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