Groovy setProperty,但有例外
我知道您可以在Groovy类中重写Groovy setProperty,但有例外,groovy,Groovy,我知道您可以在Groovy类中重写setProperty方法来拦截setter逻辑。然而,有时您希望以某种方式截取大多数setter逻辑,但在少数情况下,您希望有一个特殊的逻辑 例如,假设我们有一个如下所示的类: class PropertyDemo { @Override void setProperty( String property, Object value ) { println "Setting ${property} to ${value.toSt
setProperty
方法来拦截setter逻辑。然而,有时您希望以某种方式截取大多数setter逻辑,但在少数情况下,您希望有一个特殊的逻辑
例如,假设我们有一个如下所示的类:
class PropertyDemo {
@Override
void setProperty( String property, Object value ) {
println "Setting ${property} to ${value.toString()}"
}
void setFoo( String whatever ) {
println 'Foo'
}
void setBar( String whatever ) {
println 'Bar'
}
static void main( String[] args ) {
PropertyDemo demo = new PropertyDemo()
demo.baz = 'baz'
demo.foo = 'baz'
demo.bar = 'baz'
}
}
Setting baz to baz
Setting foo to baz
Setting bar to baz
main
调用的输出如下:
class PropertyDemo {
@Override
void setProperty( String property, Object value ) {
println "Setting ${property} to ${value.toString()}"
}
void setFoo( String whatever ) {
println 'Foo'
}
void setBar( String whatever ) {
println 'Bar'
}
static void main( String[] args ) {
PropertyDemo demo = new PropertyDemo()
demo.baz = 'baz'
demo.foo = 'baz'
demo.bar = 'baz'
}
}
Setting baz to baz
Setting foo to baz
Setting bar to baz
如您所见,甚至没有使用特殊的setFoo
和setBar
设置器。当然,如果需要,您可以显式地调用它们。您还可以添加以下内容
if( property == 'foo' ) setFoo( value )
在setProperty
的开头,使用点访问器语法。但我觉得这有点难看。那么,Groovy中是否有现成的支持向setProperty
添加异常属性,即在上述情况下为setProperty
和setBar
创建异常
非常感谢。以下是更正的代码:
@Override
void setProperty(String property, Object value) {
def metaProperty = this.metaClass.getMetaProperty(property)
if(metaProperty) metaProperty.setProperty(this, value)
else println "Setting ${property} to ${value.toString()}"
}
下面是更正的代码:
@Override
void setProperty(String property, Object value) {
def metaProperty = this.metaClass.getMetaProperty(property)
if(metaProperty) metaProperty.setProperty(this, value)
else println "Setting ${property} to ${value.toString()}"
}
下面是更正的代码:
@Override
void setProperty(String property, Object value) {
def metaProperty = this.metaClass.getMetaProperty(property)
if(metaProperty) metaProperty.setProperty(this, value)
else println "Setting ${property} to ${value.toString()}"
}
下面是更正的代码:
@Override
void setProperty(String property, Object value) {
def metaProperty = this.metaClass.getMetaProperty(property)
if(metaProperty) metaProperty.setProperty(this, value)
else println "Setting ${property} to ${value.toString()}"
}
只有当属性丢失时,才能使用
propertyMissing
进行设置:
class PropertyDemo {
def state
void propertyMissing( String property, Object value ) {
state = "Setting ${property} to ${value.toString()}"
}
void setFoo( String whatever ) {
state = 'Foo'
}
void setBar( String whatever ) {
state = 'Bar'
}
}
def demo = new PropertyDemo()
demo.with {
baz = 'baz'
assert state == 'Setting baz to baz'
foo = 'baz'
assert state == 'Foo'
bar = 'baz'
assert state == 'Bar'
}
只有当属性丢失时,才能使用
propertyMissing
进行设置:
class PropertyDemo {
def state
void propertyMissing( String property, Object value ) {
state = "Setting ${property} to ${value.toString()}"
}
void setFoo( String whatever ) {
state = 'Foo'
}
void setBar( String whatever ) {
state = 'Bar'
}
}
def demo = new PropertyDemo()
demo.with {
baz = 'baz'
assert state == 'Setting baz to baz'
foo = 'baz'
assert state == 'Foo'
bar = 'baz'
assert state == 'Bar'
}
只有当属性丢失时,才能使用
propertyMissing
进行设置:
class PropertyDemo {
def state
void propertyMissing( String property, Object value ) {
state = "Setting ${property} to ${value.toString()}"
}
void setFoo( String whatever ) {
state = 'Foo'
}
void setBar( String whatever ) {
state = 'Bar'
}
}
def demo = new PropertyDemo()
demo.with {
baz = 'baz'
assert state == 'Setting baz to baz'
foo = 'baz'
assert state == 'Foo'
bar = 'baz'
assert state == 'Bar'
}
只有当属性丢失时,才能使用
propertyMissing
进行设置:
class PropertyDemo {
def state
void propertyMissing( String property, Object value ) {
state = "Setting ${property} to ${value.toString()}"
}
void setFoo( String whatever ) {
state = 'Foo'
}
void setBar( String whatever ) {
state = 'Bar'
}
}
def demo = new PropertyDemo()
demo.with {
baz = 'baz'
assert state == 'Setting baz to baz'
foo = 'baz'
assert state == 'Foo'
bar = 'baz'
assert state == 'Bar'
}