使用 Groovy DSL 委托 getter 覆盖现有属性



在下面的示例中,我想用我自己的委托逻辑覆盖所有属性。但我只能对不存在的属性这样做,编译时已知的属性保持不变。

是否可以全部处理?

def dsl(Closure action) {
action.delegate = new Object() {
Object getProperty(String name) {
println "overriding property [$name] => Ross"
return "Ross"
}
}
action()
}
dsl {
def existingSymbol = "Joe"
println "existingSymbol: $existingSymbol"
println "inexistentSymbol: $inexistentSymbol"
}

输出:

existingSymbol: Joe     <--- expecting "Ross" here
overriding property [inexistentSymbol] => Ross
inexistentSymbol: Ross

def existingSymbol = "Joe"的问题

通过使用def可以声明具有最大优先级的新局部变量。

检查以下代码:

def dsl(Closure action) {
def delegate = new Object() {
Object getProperty(String name) {
return "Ross"
}
}
action=action.rehydrate(delegate,delegate,delegate)
action.call()
}
dsl {
def existingSymbol = "Joe"
println "1 existingSymbol: ${existingSymbol}"
println "2 existingSymbol: ${this.existingSymbol}"
}
dsl {
existingSymbol = "Joe"
println "3 existingSymbol: ${existingSymbol}"
println "4 existingSymbol: ${this.existingSymbol}"
}

输出:

1 existingSymbol: Joe
2 existingSymbol: Ross
3 existingSymbol: Ross
4 existingSymbol: Ross

最新更新