Groovy:动态属性

时间:2011-07-18 23:37:35

标签: grails groovy

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

myObj={a:'a',b:'b'}

然后你可以像这样添加属性c

myObj.c = 'c'

与Groovy相同的是什么?我必须使用metaClass吗?

使用案例:Grails中的JSON转换器不会向响应添加瞬态属性,我只想将随机属性附加到对象列表的每个元素。

2 个答案:

答案 0 :(得分:3)

您可以使用Map,它具有类似的语法和行为:

def myObj [a:'a', b:'b']
myObj.c = 'c'

您还可以使用Closures附加行为,例如

myObj.sayHello = { -> println 'Hi' }

然后将其称为方法:

myObj.sayHello()

答案 1 :(得分:3)

引自Using methodMissing and propertyMissing

Groovy还支持propertyMissing来处理属性解析尝试。对于getter,您使用带有String参数的propertyMissing定义:

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

    assertEquals "boo", f.boo

对于setter,您添加第二个propertyMissing定义,该定义采用value参数:

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一样,您可能希望在运行时动态注册新属性以提高代码的性能。