如何在Groovy中从对象获取嵌套属性值?

如何在Groovy中从对象获取嵌套属性值?,groovy,Groovy,考虑一下在Groovy中键入Company的情况: class Company { def name def contactPerson } 和联系人的联系人类型: class Contact { def firstName def lastName def email } 然后是Company类的实例: def stackOverflow = new Company( name: "Stack Overflow", contactPerson: new Cont

考虑一下在Groovy中键入
Company
的情况:

class Company {
  def name
  def contactPerson
}
联系人的
联系人
类型:

class Contact {
  def firstName
  def lastName
  def email
}
然后是Company类的实例:

def stackOverflow = new Company(
  name: "Stack Overflow",
  contactPerson: new Contact(
    firstName: "Joel",
    lastName: "Spolsky",
    email: "joel.spolsky@stackoverflow.com"
  )
)
在Groovy中,我们有:

assert stackOverflow.contactPerson.firstName == "Joel"
或:

而且:

assert stackOverflow.name == "Stack Overflow"
或:

甚至:

def fieldName = 'name'
assert stackOverflow.${fieldName} == "Stack Overflow"
但假设我们有:

def nestedFieldName = 'contactPerson.firstName'
有没有一种很好的方法来实现这样的目标:

assert stackOverflow.${nestedFieldName} == "Joel"

一种方法是减少按键序列:

nestedFieldName.split('\\.')
    .inject(stackOverflow) { object, property -> 
        object[property]
     }
它返回
'Joel'
,可用于读取任意深度的值

assert stackOverflow.${nestedFieldName} == "Joel"
nestedFieldName.split('\\.')
    .inject(stackOverflow) { object, property -> 
        object[property]
     }