Groovy instance.metaclass 与 this.metaclass

2023-12-28

我有一个以下脚本:

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。它可能会给您一些关于正在发生的事情的提示。

  1. p and q是两个不同的对象,但是
  2. p.metaClass是相同的q.metaClass, and
  3. printAll两者打印完全相同的东西,p and q
  4. 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(使用前将#替换为@)

Groovy instance.metaclass 与 this.metaclass 的相关文章

随机推荐