如何使用ProxyMetaClass拦截Groovy中的属性访问?

时间:2008-12-19 23:27:03

标签: groovy

用于拦截任意Groovy方法调用的ProxyMetaClass和Iterceptor类已有详细记录。是否还有一种拦截财产访问的方法?当我尝试拦截“getProperty”时,我仍然收到错误消息:

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

2 个答案:

答案 0 :(得分:1)

我不完全确定您尝试解决的用例,但您可能想要其中一个propertyMissinggetProperty (or maybe 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 

如果您正在使用现有类,则可以使用其中一种方法对其进行子类化,或者将这些方法添加到metaClass中:

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

assert "String's property foo" == "".foo

答案 1 :(得分:0)

您的方法似乎是正确的。尝试一些食谱here

抓住吸管:是你在元编程的类中调用方法的对象吗?有时由于多态性,你没有使用你认为自己的课程。