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