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

Pio*_*ski 3 groovy

考虑在Groovy中你有类型的情况Company:

class Company {
  def name
  def contactPerson
}
Run Code Online (Sandbox Code Playgroud)

contactPersonContact类型:

class Contact {
  def firstName
  def lastName
  def email
}
Run Code Online (Sandbox Code Playgroud)

然后我们有公司类的实例:

def stackOverflow = new Company(
  name: "Stack Overflow",
  contactPerson: new Contact(
    firstName: "Joel",
    lastName: "Spolsky",
    email: "joel.spolsky@stackoverflow.com"
  )
)
Run Code Online (Sandbox Code Playgroud)

在Groovy中,我们很简单:

assert stackOverflow.contactPerson.firstName == "Joel"
Run Code Online (Sandbox Code Playgroud)

要么:

assert stackOverflow['contactPerson']['firstName'] == "Joel"
Run Code Online (Sandbox Code Playgroud)

并且:

assert stackOverflow.name == "Stack Overflow"
Run Code Online (Sandbox Code Playgroud)

要么:

assert stackOverflow['name'] == "Stack Overflow"
Run Code Online (Sandbox Code Playgroud)

甚至:

def fieldName = 'name'
assert stackOverflow.${fieldName} == "Stack Overflow"
Run Code Online (Sandbox Code Playgroud)

但是假设我们有:

def nestedFieldName = 'contactPerson.firstName'
Run Code Online (Sandbox Code Playgroud)

是否有Groovy方式来实现这样的事情:

assert stackOverflow.${nestedFieldName} == "Joel"
Run Code Online (Sandbox Code Playgroud)

ern*_*t_k 6

一种方法是减少一系列键:

nestedFieldName.split('\\.')
    .inject(stackOverflow) { object, property -> 
        object[property]
     }
Run Code Online (Sandbox Code Playgroud)

返回'Joel',并可用于读取任意深度的值.