Groovy元编程(getProperty)仅在从类外部调用时才起作用?

时间:2019-05-07 21:01:31

标签: groovy metaprogramming

我尝试了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

1 个答案:

答案 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机制的主要目的是覆盖不存在的属性的访问。在我看来,这使默认情况下的现有属性成为一个合理的选择,并且它们仍然为您敞开了大门,因为您始终可以像上面一样使用类型化访问来强制执行操作。