これは、Groovy の「プロパティ」スタイルのアクセスと一致する方法で行われたものだけでなく、特定のクラスのフィールドへのすべてのアクセスをインターセプトすることに関する私の質問に関連しています。ここで確認できます: groovy で LOCAL プロパティ アクセスをインターセプトします。
私の問題を確実に解決することがわかった1つの方法は、コンパイル時にASTを使用して、プロパティアクセスで非プロパティアクセスを書き直すことです。たとえば、 if クラスは次のようになります。
class Foo {
def x = 1
def getter() {
x
}
def getProperty(String name) {
this."$name" ++
}
}
foo = new Foo()
assert foo.getter() == 1
assert foo.x == 2
getter メソッドが x に直接アクセスし、foo.x が getProperty("x") を通過して x をインクリメントしてから戻るため、これらの assert ステートメントは機能します。
試行錯誤の末、AST 変換を使用してコードの動作を変更し、「getter」メソッドの式「x」が実際にはローカル フィールドではなくプロパティとしてアクセスされるようにすることができます。ここまでは順調ですね!
では、特定のクラスのローカル フィールドへのすべてのアクセスを取得するにはどうすればよいでしょうか。私はある種の AST ツリー ウォーカー ヘルパーを探してインターネットをくまなく調べてきましたが、見つかりませんでした。http://groovy.codehaus.org/api/org/codehaus/groovy/ast/expr/package-summary.htmlの 38 種類の式すべてとhttp: //groovy.codehaus.org/api/org/codehaus/groovy/ast/stmt/package-summary.html ? それは誰かがすでに書いたに違いないもののように思えますが (最初に AST ツリーを構築するのに不可欠であるため)、私はそれを見つけることができないようです。