Grails Groovy:动态特性

Grails Groovy:动态特性,grails,groovy,Grails,Groovy,在Javascript中,您可以使用属性a和b定义对象,如下所示: myObj={a:'a',b:'b'} 然后你可以像这样添加一个属性c myObj.c = 'c' 在Groovy中,它的等价物是什么?我必须使用元类吗 用例:Grails中的JSON转换器不会向响应添加临时属性,我只想向对象列表的每个元素附加一个随机属性 您可以使用具有类似语法和行为的映射: def myObj [a:'a', b:'b'] myObj.c = 'c' 您还可以使用闭包附加行为,例如 myObj.sayH

在Javascript中,您可以使用属性a和b定义对象,如下所示:

myObj={a:'a',b:'b'}
然后你可以像这样添加一个属性c

myObj.c = 'c'
在Groovy中,它的等价物是什么?我必须使用元类吗


用例:Grails中的JSON转换器不会向响应添加临时属性,我只想向对象列表的每个元素附加一个随机属性

您可以使用具有类似语法和行为的
映射

def myObj [a:'a', b:'b']
myObj.c = 'c'
您还可以使用闭包附加行为,例如

myObj.sayHello = { -> println 'Hi' }
然后像方法一样调用它:

myObj.sayHello()

您可以使用具有类似语法和行为的
映射

def myObj [a:'a', b:'b']
myObj.c = 'c'
您还可以使用闭包附加行为,例如

myObj.sayHello = { -> println 'Hi' }
然后像方法一样调用它:

myObj.sayHello()
引述自:

Groovy还支持propertyMissing来处理属性解析尝试。对于getter,您使用接受字符串参数的propertyMissing定义:

  class Foo {
       def propertyMissing(String name) { name }
    }
    def f = new Foo()

    assertEquals "boo", f.boo
class Foo {
   def storage = [:]
   def propertyMissing(String name, value) { storage[name] = value }
   def propertyMissing(String name) { storage[name] }
}
def f = new Foo()
f.foo = "bar"

assertEquals "bar", f.foo
对于setters,添加第二个propertyMissing定义,该定义采用值参数:

  class Foo {
       def propertyMissing(String name) { name }
    }
    def f = new Foo()

    assertEquals "boo", f.boo
class Foo {
   def storage = [:]
   def propertyMissing(String name, value) { storage[name] = value }
   def propertyMissing(String name) { storage[name] }
}
def f = new Foo()
f.foo = "bar"

assertEquals "bar", f.foo
与methodMissing一样,您可能希望在运行时动态注册新属性,以提高代码的性能。

引用:

Groovy还支持propertyMissing来处理属性解析尝试。对于getter,您使用接受字符串参数的propertyMissing定义:

  class Foo {
       def propertyMissing(String name) { name }
    }
    def f = new Foo()

    assertEquals "boo", f.boo
class Foo {
   def storage = [:]
   def propertyMissing(String name, value) { storage[name] = value }
   def propertyMissing(String name) { storage[name] }
}
def f = new Foo()
f.foo = "bar"

assertEquals "bar", f.foo
对于setters,添加第二个propertyMissing定义,该定义采用值参数:

  class Foo {
       def propertyMissing(String name) { name }
    }
    def f = new Foo()

    assertEquals "boo", f.boo
class Foo {
   def storage = [:]
   def propertyMissing(String name, value) { storage[name] = value }
   def propertyMissing(String name) { storage[name] }
}
def f = new Foo()
f.foo = "bar"

assertEquals "bar", f.foo

与methodMissing一样,您可能希望在运行时动态注册新属性以提高代码的性能。

如果我们讨论的是域类,我不能使用映射。我想向列表的每个成员添加属性。向列表的每个成员添加属性只不过是一个映射(键值对)。如果我们谈论的是一个域类,我不能使用映射。我想为列表中的每个成员添加一个属性。向列表中的每个成员添加属性只不过是一个映射(键值对)Steve,感谢您的发布。我有两个问题。1.因为Foo已经有了一个映射属性存储,所以您只需设置f.storage.Foo='bar'。2我不想用propertyMissing方法装饰我所有的grails域类。感觉很重。我仍在寻找更优雅的解决方案。很好。喜欢groovy X-Missing。@DmitryB:1)是的,在那个例子中您可以访问f.storage.foo。但是,您也可以访问f.foo,这正是我认为您想要做的。2) 您可以使用一个类别将propertyMissing方法应用于您的每个域。此外,我想我现在更了解您的问题。如果您希望在使用转换器(domainObj作为JSON)时为grails域对象提供自定义JSON响应,则可以使用InstanceMethodBasedMarshaller在域中注册自定义toJSON()方法。有关基于XML的示例,请参阅。Steve,感谢您的发布。我有两个问题。1.因为Foo已经有了一个映射属性存储,所以您只需设置f.storage.Foo='bar'。2我不想用propertyMissing方法装饰我所有的grails域类。感觉很重。我仍在寻找更优雅的解决方案。很好。喜欢groovy X-Missing。@DmitryB:1)是的,在那个例子中您可以访问f.storage.foo。但是,您也可以访问f.foo,这正是我认为您想要做的。2) 您可以使用一个类别将propertyMissing方法应用于您的每个域。此外,我想我现在更了解您的问题。如果您希望在使用转换器(domainObj作为JSON)时为grails域对象提供自定义JSON响应,则可以使用InstanceMethodBasedMarshaller在域中注册自定义toJSON()方法。有关基于XML的示例,请参见。