Сначала взгляните на следующий код Groovy:
class Car {
def check() { System.out.println "check called..." }
def start() { System.out.println "start called..." }
}
Car.metaClass.invokeMethod = { String name, args ->
System.out.print("Call to $name intercepted... ")
if (name != 'check') {
System.out.print("running filter... ")
Car.metaClass.getMetaMethod('check').invoke(delegate, null)
}
def validMethod = Car.metaClass.getMetaMethod(name, args)
if (validMethod != null) {
validMethod.invoke(delegate, args)
} else {
Car.metaClass.invokeMissingMethod(delegate, name, args)
}
}
car = new Car()
car.start()
Результат:
Call to start intercepted... running filter... check called...
start called...
В соответствии с механизмом диспетчеризации методов Groovy я думаю, что метод запуска в автомобиле должен вызываться напрямую, а не перехватываться с помощью invokeMethod в метаклассе автомобиля. Почему метод запуска перехватывается методом invokeMethod? Как вызывается метод invokeMethod при вызове метода для объекта?
Если вы можете дать мне несколько подробных объяснений о механизме диспетчеризации методов Groovy (MOP), я буду признателен.