【发布时间】:2016-10-07 13:47:14
【问题描述】:
我无法理解 GroovyClassLoader 缓存如何与 expando 方法一起使用。
特别是,我希望以下代码为 Number.test() 的每次调用提供不同的输出,但事实并非如此。
int i = 1
Number.metaClass.test = {
return "A string"
}
println i.test()
println GroovySystem.metaClassRegistry.getMetaClass(Number.class)
Number.metaClass = null
println GroovySystem.metaClassRegistry.getMetaClass(Number.class)
Number.metaClass.test = {
return "Another String"
}
println i.test()
println GroovySystem.metaClassRegistry.getMetaClass(Number.class)
GroovySystem.metaClassRegistry.removeMetaClass(Number.class)
println GroovySystem.metaClassRegistry.getMetaClass(Number.class)
Number.metaClass.test = {
return "Yet another String"
}
println i.test()
输出:
A string
groovy.lang.ExpandoMetaClass@3571b748[class java.lang.Number]
groovy.lang.MetaClassImpl@7748410a[class java.lang.Number]
A string
groovy.lang.ExpandoMetaClass@37f1104d[class java.lang.Number]
groovy.lang.MetaClassImpl@55740540[class java.lang.Number]
A string
编辑:
我尝试了更多的东西。看起来我的系统表现得很奇怪。给定以下代码:
def i = 1
i.class
Number.metaClass.test = {
return "A string"
}
println i.test()
Number.metaClass = null
Number.metaClass.test = {
return "Another String"
}
println i.test()
GroovySystem.metaClassRegistry.removeMetaClass(Number.class)
Number.metaClass.test = {
return "Yet another String"
}
println i.test()
当我在我的系统上执行它时,它会按预期工作(在输出中获得 3 个不同的字符串),但如果我评论了所谓的无用 i.class,它会失败(3 x A string)。
但是,如果我在 groovy-console.appspot.com 上执行它,无论有没有该行,它都会给我预期的输出...
我有点不知所措。
【问题讨论】: