2014-06-19 52 views
1

我嘗試攔截DSL對象的某些setter調用,以便在使用不推薦使用的屬性時可以打印警告。如何在Groovy中一般地包裝一個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每個讀取權限。

回答

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