【问题标题】:Override existing properties with Groovy DSL delegate getter使用 Groovy DSL 委托 getter 覆盖现有属性
【发布时间】:2020-02-15 22:01:34
【问题描述】:

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

是否可以全部处理?

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

【问题讨论】:

    标签: groovy dsl


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 2016-09-04
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      相关资源
      最近更新 更多