В этой книге я столкнулся со строгим кодом сценария. И это породило некоторые странные результаты для меня.Groovy: this.metaClass Versus instance.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: [email protected][class Person]
instance.metaClass: [email protected][[email protected][class Person]]
Caught: Assertion failed:
//I did not paste the detailed assertion here for simplicity
Так что я совсем запутался:
- почему this.metaClass не равна instance.metaClass?
- Кроме того, я не могу использовать this.metaClass для ввода новых методов; groovy говорит мне, что this.metaClass не имеет такого свойства, которое я намеревался ввести.
- Что такое «[email protected]c [[email protected] [class Person]]» означает? Я знаю, что «245b4bdc» может быть указателем на объект. Но почему HandleMetaClass и MetaClassImpl имеют одно и то же значение указателя «245b4bdc»?
В настоящее время, я понял, что @ 245b4bdc не "Ссылка на объект", так HandleMetaClass @ 245b4bdc не обязательно тот же экземпляр, как MetaClassImpl @ 245b4bdc. Мы можем использовать метод Object.is(), чтобы судить, являются ли они то же самое. (Я сделал это, результат ложным)
Если вы измените его на 'утверждают this.class. metaClass == instance.metaClass', он проходит. – bdkosher
Почему? Должен ли this.class.metaClass == Person.metaClass? – Guocheng
Нашел лучший ответ здесь, https://stackoverflow.com/a/45407488/42769, на самом деле, это я. –