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

使用Groovy DSL委托getter覆盖现有属性,groovy,dsl,Groovy,Dsl,在下面的示例中,我想用我自己的委托逻辑覆盖所有属性。但我只能对不存在的属性这样做,编译时已知的属性保持不变 有可能全部处理吗 def dsl(Closure action) { action.delegate = new Object() { Object getProperty(String name) { println "overriding property [$name] => Ross" return "R

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

有可能全部处理吗

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

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