3

まず、次の 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) について詳しく説明していただければ幸いです。

4

1 に答える 1

4

つまり、標準のメタ クラスを使用していないため、標準の Groovy MOP を取得できません。

Car.metaClass.invokeMethod = {Car に ExpandoMetaClass をメタ クラスとして持たせることができます。このメタ クラスは、呼び出しをインターセプトするために (ユーザーが行うように) open ブロックとして指定した invokeMethod を使用します。これは、クラス自体で invokeMethod を定義することとは大きく異なります。

于 2015-06-15T05:45:37.417 に答える