如何在Groovy中通用地包装setter?

如何在Groovy中通用地包装setter?,groovy,interceptor,Groovy,Interceptor,我尝试截取DSL对象的某些setter调用,以便在使用不推荐的属性时打印警告 为了避免为每个不推荐使用的属性创建自定义设置器,我希望将这些设置器替换为以下内容: void setFoo(value) { println "foo is deprecated" actualSetFoo(value) } 我确实尝试了在网上找到的许多解决方案,但要么调用没有被拦截,要么出现了堆栈溢出,因为我递归地调用了拦截器,要么找不到实际的setter 我的最新解决方案如下: String se

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

为了避免为每个不推荐使用的属性创建自定义设置器,我希望将这些设置器替换为以下内容:

void setFoo(value) {
    println "foo is deprecated"
    actualSetFoo(value)
}
我确实尝试了在网上找到的许多解决方案,但要么调用没有被拦截,要么出现了堆栈溢出,因为我递归地调用了拦截器,要么找不到实际的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)
}
String setterName='set'+propertyName.capitalize()
//返回ExpandoMetaProperty
def original=extension.metaClass.“$setterName”
元类“$setterName”
println“属性“$propertyName”已被弃用”
原始.setProperty(propertyName,arg)
}

但是抛出的
groovy.lang.GroovyRuntimeException:无法为每个读取访问获取$class上的只读属性“$property”的值。

显然,您仍然需要适应您的情况,但它就是这样工作的:

class Something {
    String text
}

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

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

println something.text