5

Groovy のパッケージ名規則を使用して、次のように Java メソッドへの Groovy メソッド呼び出しをインターセプトできます。

package groovy.runtime.metaclass.org.myGang.myPackage

class FooMetaClass extends groovy.lang.DelegatingMetaClass
{
    FooMetaClass(MetaClass delegate)
    {
        super(delegate);
    }

    public Object getProperty(Object a, String key)
    {
        return a.someMethod(key)
    }
}

クラス Foo のオブジェクトを実際に作成すると、これはうまく機能します。

def myFoo = new Foo()
def fooProperty = myFoo.bar // metaclass invokes myFoo.someMethod("bar")

しかし、Foo がインターフェースであり、その実装へのメソッド呼び出しをインターセプトしたい場合はどうでしょうか?

def myFoo = FooFactory.create()   // I don't know what class this will be
fooProperty = myFoo.bar

インターフェイスの既知の実装ごとに DelegatingMetaClass を持たずにこれを達成する方法はありますか?

4

1 に答える 1

4

「groovy.runtime.metaclass.CustomMetaClassCreationHandle」という名前のクラスを作成して、メタクラス作成プロセスをグローバルに処理できます。

このクラス内で、このメソッドをオーバーライドできます。

protected MetaClass createNormalMetaClass(Class theClass, MetaClassRegistry registry) {
  // if theClass instanceof Foo, return your special metaclass
  // else return super.createNormalMetaClass(theClass, registry)
}
于 2009-02-14T21:42:25.807 に答える