我有这个代码存根来添加动态属性。我使用mongodb,我想动态添加属性。这是我在单元测试时尝试做的。
User.metaClass.dynamicAttributes = [:]
User.metaClass.propertyMissing = { String name ->
delegate.dynamicAttributes[name]
}
User.metaClass.propertyMissing = { String name, value ->
delegate.dynamicAttributes[name] = value
}
但这失败了,我正在超越我的耐心限制!
User u = new User()
u.ppt = 0
User u2 = new User()
u2.ppt = 1
assert u2.ppt == 1
assert u.ppt == 0 // fails here, println shows that u.ppt is also 1!
答案 0 :(得分:1)
这里的问题是你的概念完全有缺陷。您正在为此类而不是具有此行的实例分配映射:
User.metaClass.dynamicAttributes = [:]
为了完成您的目标,您需要执行以下操作:
User.metaClass.propertyMissing = { String name ->
if (!delegate.dynamicAttributes) delegate.dynamicAttributes = [:]
delegate.dynamicAttributes[name]
}
User.metaClass.propertyMissing = { String name, value ->
if (!delegate.dynamicAttributes) delegate.dynamicAttributes = [:]
delegate.dynamicAttributes[name] = value
}
我确信有更简洁的方法可以做到这一点,但上面演示了一个解决方案,其中地图是按实例实例化而不是跨所有实例。
答案 1 :(得分:0)
更改此
User.metaClass.dynamicAttributes = [:]
User.metaClass.propertyMissing = { String name ->
delegate.dynamicAttributes[name]
}
User.metaClass.propertyMissing = { String name, value ->
delegate.dynamicAttributes[name] = value
}
到这个
User.metaClass.propertyMissing = { String name ->
if (!delegate.metaClass.hasProperty('dynamicAttributes') delegate.metaClass.dynamicAttributes = [:]
delegate.dynamicAttributes[name]
}
User.metaClass.propertyMissing = { String name, value ->
if (!delegate.metaClass.hasProperty('dynamicAttributes') delegate.metaClass.dynamicAttributes = [:]
delegate.dynamicAttributes[name] = value
}
解决了!我不确定,但似乎groovy共享通过metaClass放置的属性!