这与我关于拦截对给定类中的字段的所有访问的问题有关,而不仅仅是那些以与 Groovy“属性”样式访问一致的方式完成的访问。您可以在此处查看:在 groovy 中拦截 LOCAL 属性访问。
我发现肯定会解决我的问题的一种方法是在编译时使用 AST 用属性访问重写任何非属性访问。例如,如果一个类看起来像这样:
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。
经过一些试验和错误后,我可以使用 AST 转换来更改代码的行为,以便“getter”方法中的表达式“x”实际上作为属性而不是本地字段进行访问。到目前为止,一切都很好!
现在,我该如何访问给定类中本地字段的所有访问权限?我一直在互联网上寻找某种 AST tree walker helper,但还没有找到。我真的需要在这里http://groovy.codehaus.org/api/org/codehaus/groovy/ast/expr/package-summary.html和所有 18 种语句类型http://groovy.codehaus.org/api/org/codehaus/groovy/ast/expr/package-summary.html实现一个表达式步行器: //groovy.codehaus.org/api/org/codehaus/groovy/ast/stmt/package-summary.html ? 这似乎是某人必须已经写过的东西(因为它首先是构建 AST 树的组成部分),但我似乎找不到它。