Ho incontrato il codice di script di Groovy nel libro. E ha generato alcune uscite strane per me.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()
il suo output è il seguente:
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
, quindi sono abbastanza confuso:
- perché è this.metaClass non è uguale a instance.metaClass?
- ulteriore, non posso usare this.metaClass per iniettare nuovi metodi; groovy mi ha detto che this.metaClass non ha tale proprietà, che intendevo iniettare.
- Che cosa significa "[email protected] [[email protected] [class Person]]" significa? So che "245b4bdc" potrebbe essere il puntatore dell'oggetto. Ma perché HandleMetaClass e MetaClassImpl hanno lo stesso valore di puntatore "245b4bdc"?
Attualmente, ho capito che @ 245b4bdc non è il "riferimento oggetto", così HandleMetaClass @ 245b4bdc non è necessariamente la stessa istanza come MetaClassImpl @ 245b4bdc. Siamo in grado di utilizzare il metodo Object.is() per giudicare se sono la stessa. (Ho fatto, è risultato falso )
Se si modifica a 'valere this.class. metaClass == instance.metaClass', passa. – bdkosher
Perché? Dovrebbe this.class.metaClass == Person.metaClass? – Guocheng
Trovato una risposta migliore qui, https://stackoverflow.com/a/45407488/42769, in realtà, sono io. –