我尝试拦截我的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
。
答案 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