Groovy: этот.metaClass и экземпляр.metaClass

Я столкнулся ниже с отличным кодом сценария в книге. И это дало мне странные результаты.

class Person{
  def work(){
    println "work()"
  }
  def sports=['basketball','football','voleyball']
  def methodMissing(String name, args){
    if(name in sports){
        println "injected ${name} into Person class"
        Person instance=this
        println "this.metaClass:\t\t${this.metaClass}"
        println "instance.metaClass:\t${instance.metaClass}"
        assert this.metaClass==instance.metaClass
    }else{
        println "no such method:${name}() in Person class"
    }
  }
}
def jack=new Person()
jack.football()

это как показано ниже:

injected football into Person class
this.metaClass:     groovy.lang.MetaClassImpl@245b4bdc[class Person]
instance.metaClass: org.codehaus.groovy.runtime.HandleMetaClass@245b4bdc[groovy.lang.MetaClassImpl@245b4bdc[class Person]]
Caught: Assertion failed: 
//I did not paste the detailed assertion here for simplicity

Так что я совсем запутался

почему this.metaClass не равно instance.metaClass?более того, я не могу использовать this.metaClass для внедрения новых методов; groovy говорит мне, что this.metaClass не имеет такого свойства, которое я намеревался внедрить.Что означает «org.codehaus.groovy.runtime.HandleMetaClass@245b4bdc [groovy.lang.MetaClassImpl@245b4bdc [класс Person]]»? Я знаю, что "245b4bdc" может быть указателем объекта. Но почему HandleMetaClass и MetaClassImpl имеют одинаковое значение указателя "245b4bdc"?

В настоящее время я понял, что @ 245b4bdc не является "Ссылка на объект", ТакHandleMetaClass @ 245b4bdc не обязательно тот же экземпляр, что иMetaClassImpl @ 245b4bdc, Мы можем использовать метод Object.is (), чтобы определить, являются ли они одинаковыми. (Я сделал это, результатложный)

Ответы на вопрос(1)

Ваш ответ на вопрос