В чем разница между metaClass.methods и metaClass.metaMethods?

Если я добавлю мета-метод к классу, я ожидаю, что он появится в Class.metaClass.metaMethods . Но, похоже, это не так. В частности, если я сделаю это:

class Example {
    def realFoo() { "foo" }

}
Example.metaClass.metaFoo = { -> "foo" }

def reals = Example.metaClass.methods*.name.grep{it.contains("Foo")}
def metas = Example.metaClass.metaMethods*.name.grep{it.contains("Foo")}

println "reals = $reals, metas = $metas"

, я бы ожидал вывода reals = [realFoo], metas = [metaFoo] , но на самом деле я получаю reals = [realFoo, metaFoo], metas = [] .

Похоже, что новые мета-методы хранятся в методах, а не в metaMethods. Итак, в чем разница между metaClass.methods и metaClass.metaMethods ?

5
задан ataylor 3 February 2011 в 18:28
поделиться