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