gpt4 book ai didi

gradle - Groovy instance.metaclass与this.metaclass

转载 作者:行者123 更新时间:2023-12-03 04:00:30 27 4
gpt4 key购买 nike

我有以下脚本:

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}"
}
}

enter image description here

看一下 groovysh的屏幕截图。它可能会给您一些提示。
  • pq是两个不同的对象,但是
  • p.metaClassq.metaClass
  • 相同
  • printAllpq都打印完全相同的内容
  • a.metaClassb.metaClass持有this.class.metaClass,而不是this.metaClass,您看到

  • 对于 MetaClassImpl,只有一个由 HandleMetaClass创建的对象,也只有一个 Person创建的对象。而且,无论您实例化 Person多少次,它们都会被分配给实例。但是,当您扩展任何一个实例时,只有这样,才会创建一个新的 HandleMetaClass对象-仅针对该特定对象;这次 HandleMetaClass将不保存 MetaClassImpl,而是 ExpandoMetaClass

    请看下面的截图,

    enter image description here

    现在,为了回答您的问题, this.metaClass是一种特殊情况,就像 this本身一样。它没有为您提供句柄 HandleMetaClass对象,因此您无法直接扩展 metaClassthis。也是没有意义的,因为那样以后所有其他将来的实例都将共享该扩展。

    如果您确实想要这种行为,则可以像在构造函数中一样将 this传递给其他变量,即 instance = this,然后可以扩展该 instance-并且这种扩展对于 this和所有其他将来的实例都是正确的。但是,首先为什么不将行为添加到类本身。为什么要扩大?

    关于gradle - Groovy instance.metaclass与this.metaclass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45404442/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com