我有一个以下脚本:
task myTask {}
class Person {
Person() {
Person instance = this
println this.metaClass.class.name
println this.getMetaClass().class.name
println instance.metaClass.class.name
println instance.getMetaClass().class.name
}
}
Person person = new Person()
输出是:
groovy.lang.MetaClassImpl
groovy.lang.MetaClassImpl
org.codehaus.groovy.runtime.HandleMetaClass
org.codehaus.groovy.runtime.HandleMetaClass
谁能向我解释这是怎么回事?
提前致谢。
看看这个class
,
class Person {
def a, b
Person() {
a = this
b = this
println "this $this"
println "a $a"
println "b $b"
}
def printAll() {
println "this.metaClass ${this.metaClass}"
println "this.class.metaClass ${this.class.metaClass}"
println "a.metaClass ${a.metaClass}"
println "b.metaClass ${b.metaClass}"
}
}
看一下屏幕截图groovysh
。它可能会给您一些关于正在发生的事情的提示。
-
p
and q
是两个不同的对象,但是
-
p.metaClass
是相同的q.metaClass
, and
-
printAll
两者打印完全相同的东西,p
and q
-
a.metaClass
and b.metaClass
正在持有this.class.metaClass
, not this.metaClass
, 你看
仅创建一个对象MetaClassImpl
,并且也只有其中之一HandleMetaClass
, for Person
。而且无论你实例化多少次Person
,它们将被分配给实例。但是,当您扩展任何该实例时,只有一个新的HandleMetaClass
对象将被创建——只是为了那个特定的对象;而这一次HandleMetaClass
将持有不MetaClassImpl
, but ExpandoMetaClass
反而。
请看下面的截图,
现在,回答你的问题,this.metaClass
是一个特殊情况,比如this
本身。它不给你把柄,HandleMetaClass
对象,所以你不能扩展metaClass
of this
- 直接地;这也没有任何意义,因为这样所有其他未来的实例都将共享该扩展。
如果你真的想要这种行为那么你可以通过this
到其他一些变量,即instance = this
,就像您在构造函数中所做的那样,然后您可以对其进行扩展instance
——这种扩展对于this
以及所有其他未来的实例。但是,为什么不首先将行为添加到类本身呢?为什么要扩张?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)