Когда был создан экземпляр класса HandleMetaClass в Groovyd и почему он изменился при создании нового объекта - PullRequest
0 голосов
/ 26 апреля 2019

Я не понимаю, почему создаются объекты HandleMetaClass, и когда добавляются новые атрибуты и методы, вновь созданный объект HandleMetaClass заменяется другим экземпляром объекта.Почему this.metaclass отличается от a.aclass.

import groovy.transform.Trait
import org.codehaus.groovy.runtime.HandleMetaClass
import org.codehaus.groovy.runtime.InvokerHelper


class Person {

    def test() {
        def a = this
        def b = a
        println "a.metaClass-------->>>" + a.metaClass
        println "b.metaClass-------->>>" + b.metaClass
        println "this.metaClass-------->>>" + this.metaClass
    }
}


def person = new Person()

//println person.saysd()

println "Person.metaClass-------->>>" + Person.metaClass

println "person.metaClass-------->>>" + person.metaClass
person.test()


person.metaClass.d="@"

println "person.metaClass-------->>>" + person.metaClass



def newperson = new Person()
println "newperson.metaClass-------->>>" + person.metaClass



Вывод выглядит следующим образом:

Person.metaClass-------->>>org.codehaus.groovy.runtime.HandleMetaClass@21e360a[groovy.lang.MetaClassImpl@21e360a[class Person]]
person.metaClass-------->>>org.codehaus.groovy.runtime.HandleMetaClass@21e360a[groovy.lang.MetaClassImpl@21e360a[class Person]]
a.metaClass-------->>>org.codehaus.groovy.runtime.HandleMetaClass@21e360a[groovy.lang.MetaClassImpl@21e360a[class Person]]
b.metaClass-------->>>org.codehaus.groovy.runtime.HandleMetaClass@21e360a[groovy.lang.MetaClassImpl@21e360a[class Person]]
this.metaClass-------->>>groovy.lang.MetaClassImpl@21e360a[class Person]
person.metaClass-------->>>org.codehaus.groovy.runtime.HandleMetaClass@1b11171f[groovy.lang.ExpandoMetaClass@1b11171f[class Person]]
newperson.metaClass-------->>>org.codehaus.groovy.runtime.HandleMetaClass@1b11171f[groovy.lang.ExpandoMetaClass@1b11171f[class Person]]
...