任意の Groovy メソッド呼び出しをインターセプトするための ProxyMetaClass および Iterceptor クラスについては、十分に文書化されています。プロパティへのアクセスを傍受する方法もありますか? 「getProperty」をインターセプトしてこれを実行しようとすると、まだエラー メッセージが表示されます。
groovy.lang.MissingPropertyException: そのようなプロパティはありません: foo
任意の Groovy メソッド呼び出しをインターセプトするための ProxyMetaClass および Iterceptor クラスについては、十分に文書化されています。プロパティへのアクセスを傍受する方法もありますか? 「getProperty」をインターセプトしてこれを実行しようとすると、まだエラー メッセージが表示されます。
groovy.lang.MissingPropertyException: そのようなプロパティはありません: foo
あなたが解決しようとしているユースケースについては完全にはわかりませんが、おそらく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
あなたのアプローチは正しいようです。ここでいくつかのレシピを試してみてください。
藁をもつかむ: メソッドを呼び出しているオブジェクトは、本当にメタプログラミングしたクラスのものですか? ポリモーフィズムが原因で、自分が思っているクラスを使用していないことがあります。