2

用于拦截任意 Groovy 方法调用的 ProxyMetaClass 和 Iterceptor 类都有很好的文档记录。还有一种方法可以拦截属性访问吗?当我尝试通过拦截“getProperty”来执行此操作时,我仍然收到错误消息:

groovy.lang.MissingPropertyException:没有这样的属性:foo

4

2 回答 2

1

我不完全确定您要解决的用例,但可能您想要propertyMissinggetProperty (或者可能是 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
于 2008-12-21T04:06:11.227 回答
0

你的方法似乎是正确的。试试这里的一些食谱。

抓着稻草:你调用方法的对象真的是你元编程的类吗?有时由于多态性,您没有使用您认为的类。

于 2009-02-12T22:05:33.537 回答