首页 文章

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

提问于
浏览
2

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

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

2 回答

  • 0

    我'm not completely sure about the use-case that you'试图解决,但你可能想要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

    你的方法似乎是正确的 . 尝试一些食谱here .

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

相关问题