【发布时间】:2016-04-28 00:02:37
【问题描述】:
在进行重构时遇到了这个问题。对 getProperties() 的调用导致我们的 CPU 使用率飙升。我们发现,如果您有一个没有关联属性的 getter,当您调用 getProperties() 时,该 getter 会被调用超过 1000 次。修复/解决方法很明显,我们知道它与元编程有关,但为什么会发生这种情况(groovy 源代码中的哪一点)?请参阅下面的 groovy 脚本代码:
class tester {
int count = 0
public getVar() {
println count++ + " getVar() called!"
return var
}
}
def t = new tester()
t.getProperties()
println "done!"
您应该看到 getVar() 被调用超过 1000 次。 1068 对我们来说是准确的。
【问题讨论】:
-
很奇怪。我刚刚在 groovy web 控制台groovyconsole.appspot.com 中尝试了这个,我看到它执行了 110 次。
-
因为
return var这一行而发生。这实际上是在递归调用getVar()本身,因为return var与调用return getVar()相同。它会打印计数,直到堆栈溢出。 -
return var是问题所在。 -
为了完整起见:docs.groovy-lang.org/latest/html/documentation/…(我知道
var字段没有在类中定义)。 -
更改 return var 以返回 this.@var 与众不同
标签: grails groovy metaprogramming