Как перехватить доступ к свойствам в Groovy с помощью ProxyMetaClass? - PullRequest
2 голосов
/ 20 декабря 2008

Классы ProxyMetaClass и Iterceptor для перехвата произвольных вызовов метода Groovy хорошо документированы. Есть ли способ перехватить доступ к свойствам? Когда я пытаюсь сделать это, перехватывая «getProperty», я все равно получаю сообщение об ошибке:

groovy.lang.MissingPropertyException: Нет такого свойства: foo

Ответы [ 2 ]

1 голос
/ 21 декабря 2008

Я не совсем уверен насчет варианта использования, который вы пытаетесь решить, но, скорее всего, вам понадобится либо propertyMissing , либо getProperty (или, возможно, invokeMethod) .

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

class Person {
    def name = "Ted"
    def propertyMissing(String name) { "my $name" }
}

def p = new Person()
assert "my address" == p.address
assert "my email" == p.email
assert "Ted" == p.name // property isn't missing

Второй позволит вам перехватывать все запросы свойств, даже для определенных свойств:

class Person {
    def name = "Ted"
    def getProperty(String name) { "my $name" }
}

def p = new Person()
assert "my address" == p.address
assert "my email" == p.email
assert "my name" == p.name 

Если вы работаете с существующим классом, вы можете либо создать его подкласс с помощью одного из этих методов, либо добавить эти методы в метакласс:

String.metaClass.getProperty = { String name ->
    return "String's property $name"
}

assert "String's property foo" == "".foo
0 голосов
/ 13 февраля 2009

Ваш подход кажется правильным. Попробуйте некоторые рецепты здесь .

Сцепление за соломинку: действительно ли объект, для которого вы вызываете методы, класса, который вы запрограммировали? Иногда из-за полиморфизма вы не используете тот класс, который вам кажется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...