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 (), чтобы определить, являются ли они одинаковыми. (Я сделал это, результатложный)