MetaMethods содержит те методы, которые оформлены в классе Groovy, но на самом деле не являются прямой частью класса или его структуры наследования, или которые были вставлены в класс вручную через метакласс.
Они определены в DefaultGroovyMethods классе.
В зависимости от типа объекта, который вы создаете, это в основном итераторы, такие как каждый, собирать, находить и т. Д.
Эта модификация вашего кода показывает методы, которые являются только мета, "реальными" и общими:
class Example {
def realFoo() { "foo" }
}
Example.metaClass.metaFoo = { -> "foo" }
def reals = Example.metaClass.methods.name.sort().unique()
def metas = Example.metaClass.metaMethods.name.sort().unique()
def metaOnly = metas - reals
def realOnly = reals - metas
def shared = reals.findAll { metas.contains(it) }
println """
metaOnly = $metaOnly
realOnly = $realOnly
shared = $shared
"""
Результат:
metaOnly = [addShutdownHook, any, asBoolean, asType, collect, dump, each, eachWithIndex, every, find, findAll, findIndexOf, findIndexValues, findLastIndexOf, findResult, getAt, getMetaPropertyValues, getProperties, grep, hasProperty, identity, inject, inspect, is, isCase, iterator, metaClass, print, printf, println, putAt, respondsTo, sleep, split, sprintf, use, with]
realOnly = [equals, getClass, getProperty, hashCode, metaFoo, notify, notifyAll, realFoo, setProperty, wait]
shared = [getMetaClass, invokeMethod, setMetaClass, toString]
Все методы metaOnly и общего доступа находятся в DefaultGroovyMethods. Все «настоящие» методы находятся в самом классе или в его родительском классе (в данном случае в Object), плюс пара отличных вещей, непосредственно связанных с metaClass для получения / установки metaClass, а также getProperty / setProperty и invokeMethod которые позволяют вам переопределить поведение метода.
Если вы хотите просмотреть все методы, чтобы увидеть, что существует, я использую что-то вроде этого:
def allMethods = (Example.metaClass.methods + Example.metaClass.metaMethods).name.sort().unique()