Groovy 使用对象访问属性。”${property}";

Groovy 使用对象访问属性。”${property}";,groovy,Groovy,我正在进行一些动态筛选,并有以下内容: class Filterable { def statusId def secondaryFilterable } ... def filter = new Filter(validIds: [1], fieldName: 'statusId') ... class Filter { def validIds = [] as Set def fieldName private boolean containsFie

我正在进行一些动态筛选,并有以下内容:

class Filterable {
    def statusId
    def secondaryFilterable
}
...
def filter = new Filter(validIds: [1], fieldName: 'statusId')
...
class Filter {

    def validIds = [] as Set
    def fieldName
    private boolean containsFieldValue(input) {
        def fieldValue = input."${fieldName}"
        return fieldValue in validIds
    }
}
这对一个物业来说很好。然而,现在我需要通过二级可过滤性进行过滤-类似于

def filter = new Filter(validIds: [1], fieldName: 'secondaryFilterable.statusId')

它抛出一个
groovy.lang.MissingPropertyException
。有什么建议吗?

引用的属性假定一个点是属性名称的一部分

一个简单的解决办法是:

...
def fieldValue = fieldName.split(/\./).inject(input){ parent, property -> parent?."$property" }
...
这将使用子属性的点符号递归查找字段值


在Groovy web控制台上。

注意:此示例不检查属性的有效性-如果属性不存在,可能会抛出错误。(请在示例链接中尝试
'foo.bar.badValue'
)。如有必要,可以通过使用添加检查来防止出现这种情况。该检查可能重复