我尝试了Groovy的一些(运行时)元编程。我继续并实现了GroovyInterceptable的getProperty方法。但是现在我发现这仅在从外部获取对象的属性时才有效。从该类的方法内部获取属性时,不会调用我的getProperty方法(请参见下面的代码示例)。
现在,这是预期的,并且一直都是这样吗?一位同事告诉我,过去这与以前有所不同(与他所记得的不同)。从内部和外部读取属性的另一种方法是调用我的getProperty方法吗?
class SomeGroovyClass implements GroovyInterceptable {
def foo
SomeGroovyClass() {
foo = "ctor"
}
def getProperty(String name) {
if (name == "foo") {
return "blub"
} else {
return "foo"
}
}
def test2() {
System.out.println "foo from inside via method call: " + this.foo
}
}
def someGroovyClass = new SomeGroovyClass()
System.out.println "foo from outside: " + someGroovyClass.foo
someGroovyClass.test2()
输出为
foo from outside: blub
foo from inside via method call: ctor
答案 0 :(得分:1)
强制使用getProperty方法的一种方法是强制用于访问this
的类型。将您的test2
方法更改为:
def test2() {
println "foo from inside via method call: " + ((GroovyInterceptable) this).foo
}
结果:
~> groovy solution.groovy
foo from outside: blub
foo from inside via method call: blub
强制类型的替代:
def test2() {
def me = this as GroovyInterceptable
println "foo from inside via method call: " + me.foo
}
和
def test2() {
GroovyInterceptable me = this
println "foo from inside via method call: " + me.foo
}
我可以查看groovy编译器的来源...除非您没有明确的了解,否则实际上没有办法知道它正在寻找foo
属性的哪个处理。
我认为getProperty
机制的主要目的是覆盖不存在的属性的访问。在我看来,这使默认情况下的现有属性成为一个合理的选择,并且它们仍然为您敞开了大门,因为您始终可以像上面一样使用类型化访问来强制执行操作。