Groovy метапрограммирование (getProperty) работает только при вызове извне класса? - PullRequest
0 голосов
/ 08 мая 2019

Я попробовал некоторое (во время выполнения) метапрограммирование с Groovy.Я пошел дальше и реализовал метод getProperty GroovyInterceptable.Но теперь я узнал, что это работает только при получении свойства объекта снаружи.При получении свойства изнутри метода в этом классе мой метод 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 Ответ

1 голос
/ 08 мая 2019

Одним из способов принудительного использования метода 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 состоит в том, чтобы обеспечить доступ к несуществующим свойствам.Это делает дефолт для существующего свойства, когда один из них доступен, по моему мнению, разумный выбор, и они все еще оставляют дверь открытой, поскольку вы всегда можете форсировать вещи, используя типизированный доступ, как описано выше.

...