如何在Groovy中一般包装一个setter?

时间:2014-06-19 09:29:52

标签: groovy interceptor

我尝试拦截我的DSL对象的某些setter调用,以便在使用不推荐使用的属性时可以打印警告。

为了避免为每个弃用的属性创建自定义setter,我想一般用以下内容替换这些setter:

void setFoo(value) {
    println "foo is deprecated"
    actualSetFoo(value)
}

我确实在网上尝试了很多解决方案,但要么调用没有被截获,就有一个StackOverflow,因为我递归地调用了拦截器,或者找不到实际的setter。

我的最新解决方案如下:

String setterName = 'set' + propertyName.capitalize()
// returns ExpandoMetaProperty
def original = extension.metaClass."$setterName"

extension.metaClass."$setterName" << { arg ->
    println "property '$propertyName' has been deprecated"
    original.setProperty(propertyName, arg)
}

但是那个会为每次读取访问抛出groovy.lang.GroovyRuntimeException: Cannot get the value of write-only property '$property' on $class

1 个答案:

答案 0 :(得分:1)

显然你仍然需要适应你的情况,但这就是它的工作原理:

class Something {
    String text
}

Something.metaClass.setText = { arg ->
    println 'depreceated'
    delegate.@text = arg
}

def something = new Something()
something.text = 'value 123'

println something.text