2

任意の Groovy メソッド呼び出しをインターセプトするための ProxyMetaClass および Iterceptor クラスについては、十分に文書化されています。プロパティへのアクセスを傍受する方法もありますか? 「getProperty」をインターセプトしてこれを実行しようとすると、まだエラー メッセージが表示されます。

groovy.lang.MissingPropertyException: そのようなプロパティはありません: foo

4

2 に答える 2

1

あなたが解決しようとしているユースケースについては完全にはわかりませんが、おそらくpropertyMissingまたはgetProperty (またはおそらく invokeMethod)のいずれかが必要です。

1 つ目は、オブジェクトに実際に存在しないプロパティ リクエストをインターセプトできるようにします。

class Person {
    def name = "Ted"
    def propertyMissing(String name) { "my $name" }
}

def p = new Person()
assert "my address" == p.address
assert "my email" == p.email
assert "Ted" == p.name // property isn't missing

2 つ目は、定義済みのプロパティであっても、すべてのプロパティ リクエストをインターセプトできます。

class Person {
    def name = "Ted"
    def getProperty(String name) { "my $name" }
}

def p = new Person()
assert "my address" == p.address
assert "my email" == p.email
assert "my name" == p.name 

既存のクラスを使用している場合は、これらのメソッドのいずれかでサブクラス化するか、これらのメソッドを metaClass に追加できます。

String.metaClass.getProperty = { String name ->
    return "String's property $name"
}

assert "String's property foo" == "".foo
于 2008-12-21T04:06:11.227 に答える
0

あなたのアプローチは正しいようです。ここでいくつかのレシピを試してみてください。

藁をもつかむ: メソッドを呼び出しているオブジェクトは、本当にメタプログラミングしたクラスのものですか? ポリモーフィズムが原因で、自分が思っているクラスを使用していないことがあります。

于 2009-02-12T22:05:33.537 に答える