Aym*_*man 5 groovy properties metaprogramming dynamic
使用Groovy 1.8.我正在尝试创建一个动态类定义,它将缓存每个对象的属性.我确实使用了propertyMissing
没有添加属性到对象就好了.我只是认为缓存属性会更有效率.对?
请注意,每个实例必须具有自己的不同属性.
下面的代码工作正常:
class C {}
def c = new C()
c.metaClass.prop = "a C property"
println c.prop
def x = new C()
x.prop
Run Code Online (Sandbox Code Playgroud)
将输出:
a C property
groovy.lang.MissingPropertyException: No such property: prop for class: C
Run Code Online (Sandbox Code Playgroud)
如果我需要这个问题:
class A {
def propertyMissing(String name) {
if(!this.hasProperty(name)) {
println "create new propery $name"
this.metaClass."$name" = "Dyna prop $name"
println "created new propery $name"
}
this.metaClass."$name"
}
}
a = new A()
println a.p1
Run Code Online (Sandbox Code Playgroud)
因为A
,我得到了"创建新属性",但该行this.metaClass."$name" = "Dyna prop $name"
失败了:No such property: p1 for class at line 5
怎么了?
这段代码应该做你想要的:
class A {
A() {
def mc = new ExpandoMetaClass( A, false, true)
mc.initialize()
this.metaClass = mc
}
def propertyMissing( String name ) {
println "create new propery $name"
def result = "Dyna prop $name"
this.metaClass."$name" = result
println "created new propery $name"
result
}
}
a = new A()
println a.p1
println a.p1
Run Code Online (Sandbox Code Playgroud)
那输出:
create new propery p1
created new propery p1
Dyna prop p1
Dyna prop p1
Run Code Online (Sandbox Code Playgroud)
为什么不将动态属性存储在简单的HashMap中?
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"
Run Code Online (Sandbox Code Playgroud)
这是以下标准示例:http://groovy.codehaus.org/Using+methodMissing+and+propertyMissing
注意,您不必检查属性是否真的丢失...如果它不会丢失,则首先不会调用该方法.
归档时间: |
|
查看次数: |
13170 次 |
最近记录: |