用于拦截任意 Groovy 方法调用的 ProxyMetaClass 和 Iterceptor 类都有很好的文档记录。还有一种方法可以拦截属性访问吗?当我尝试通过拦截“getProperty”来执行此操作时,我仍然收到错误消息:
groovy.lang.MissingPropertyException:没有这样的属性:foo
用于拦截任意 Groovy 方法调用的 ProxyMetaClass 和 Iterceptor 类都有很好的文档记录。还有一种方法可以拦截属性访问吗?当我尝试通过拦截“getProperty”来执行此操作时,我仍然收到错误消息:
groovy.lang.MissingPropertyException:没有这样的属性:foo
我不完全确定您要解决的用例,但可能您想要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
你的方法似乎是正确的。试试这里的一些食谱。
抓着稻草:你调用方法的对象真的是你元编程的类吗?有时由于多态性,您没有使用您认为的类。