Groovy - правильный способ реализации метода getProperty

Мне нужно запускать некоторый код всякий раз, когда извлекается значение свойства, поэтому, естественно, имело смысл определить метод getProperty в моем классе. Этот метод будет автоматически вызываться всякий раз, когда будет получено значение свойства. Вот примерно то, что у меня есть в моем классе:

class MyClass
{
  def getProperty(String name)
  {
   // Run some code ...

    return this.@"${name}"
  }
}

Проблема с вышеуказанным методом возникает, когда кто-то пытается где-то сделать следующий вызов:

MyClass.class

Этот вызов завершается в методе getProperty, который ищет свойство с именем «класс», однако фактического свойства с именем «класс» нет, поэтому мы получаем MissingFieldException.

Каким будет правильный способ реализовать работающий код всякий раз, когда значение свойства извлекается, и иметь дело с такими ситуациями.


person Harry Muscle    schedule 19.02.2015    source источник


Ответы (2)


Лучше всего не использовать метод getProperty, если он не нужен. Если он вам нужен и вы хотите вернуться к стандартной логике Groovy, вы можете использовать return getMetaClass().getProperty(this, property), как можно найти в GroovyObjectSupport. Это будет охватывать не только поля.

person blackdrag    schedule 19.02.2015
comment
Привет, я думаю, это может быть то, что я ищу. Не могли бы вы привести пример или подробнее рассказать о своем ответе, особенно о том, как вернуться к стандартной логике Groovy? - person Harry Muscle; 19.02.2015
comment
это действительно просто та линия, чтобы отступить. Обычно вы обрабатываете свои особые случаи, и, если они не совпадают, вы идете по маршруту метакласса. Возможно, github.com/groovy /groovy-core/blob/master/src/main/groovy/lang/ — хороший пример. Здесь вы видите, например, что delegate обрабатывается напрямую, и если не совпадает ни один из особых случаев, код вызывает метакласс - person blackdrag; 20.02.2015

Это, кажется, общая проблема с этим методом. У карты та же проблема. Разработчики groovy решили проблему с Map, заявив, что вам нужно использовать getClass() напрямую.

person Michael Rutherfurd    schedule 19.02.2015