Groovy setProperty,但有例外

Groovy setProperty,但有例外,groovy,Groovy,我知道您可以在Groovy类中重写setProperty方法来拦截setter逻辑。然而,有时您希望以某种方式截取大多数setter逻辑,但在少数情况下,您希望有一个特殊的逻辑 例如,假设我们有一个如下所示的类: class PropertyDemo { @Override void setProperty( String property, Object value ) { println "Setting ${property} to ${value.toSt

我知道您可以在Groovy类中重写
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'
}