まず、次の 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 メソッドのディスパッチ メカニズムによると、Car のメタクラスの invokeMethod によってインターセプトされるのではなく、Car の start メソッドを直接呼び出す必要があると思います。start メソッドが invokeMethod によってインターセプトされるのはなぜですか? オブジェクトでメソッドが呼び出されると、invokeMethod はどのように呼び出されますか?
Groovy のメソッド ディスパッチ メカニズム (MOP) について詳しく説明していただければ幸いです。