Я пытаюсь перехватить определенные вызовы сеттера для моих объектов DSL, чтобы я мог печатать предупреждения, когда используются устаревшие свойства.Как обобщить сеттер в Groovy?
Чтобы избежать создания пользовательских сеттеры для каждого устаревшего имущества, я хотел бы в общем заменить эти сеттеры что-то вроде:
void setFoo(value) {
println "foo is deprecated"
actualSetFoo(value)
}
я сделал попробовать многочисленные решения, найденные в сети, но либо вызов не получить перехваченный, был StackOverflow, потому что я рекурсивно называл перехватчик или фактический сеттер не мог быть найден.
Мое последнее решение заключается в следующем:
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
для каждого доступа на чтение.