2014-06-19 3 views
1

Я пытаюсь перехватить определенные вызовы сеттера для моих объектов 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 для каждого доступа на чтение.

ответ

1

Очевидно, что вам еще нужно адаптироваться к вашему делу, но вот как это работает:

class Something { 
    String text 
} 

Something.metaClass.setText = { arg -> 
    println 'depreceated' 
    [email protected] = arg 
} 

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

println something.text 
Смежные вопросы