GroovyInterceptable&介绍属性

时间:2014-05-28 00:20:48

标签: groovy

我有一个实现GroovyInterceptable的类,我认为应该让所有方法调用都通过" invokeMethod'。但我发现事实并非如此。

class Test implements GroovyInterceptable{

    String name

    @Override
    Object invokeMethod(String name, Object args) {
        def metaMethod = this.metaClass.getMetaMethod(name, args)
        return metaMethod.invoke(this, "BAR")
    }

    public static void main(String[] args) {
        Test.metaClass.NEWATTRIBUTE = null

        def test = new Test()
        test.NEWATTRIBUTE = "MEOW1"
        println test.NEWATTRIBUTE   // shouldnt this be BAR ?


        test.setNEWATTRIBUTE("MEOW2")
        println test.NEWATTRIBUTE // prints 'BAR'


        // much simpler example ....

        test.name = "MOOO"
        println test.name // shouldnt this be BAR ?

        test.setName("MOOO")
        println test.name // prints 'BAR'
    }
}

我想我读到了某个地方,

test.NEWATTRIBUTE = "MEOW1"

并不直接访问该字段。 Groovy仍然会调用setter方法 - 因此invokeMethod应该被调用,不是吗?

由于

亚历

2 个答案:

答案 0 :(得分:1)

设置属性时,Groovy会调用setProperty。将此方法添加到类:

void setProperty(String prop, val) {
    System.out.println "set property $prop with $val"
}

答案 1 :(得分:0)

WillP:非常感谢。这是完整的代码:

class Test implements GroovyInterceptable{

    String name

    @Override
    Object invokeMethod(String name, Object args) {
        def metaMethod = this.metaClass.getMetaMethod(name, args)
        return metaMethod.invoke(this, "BAR")
    }

    void setProperty(String prop, val) {
        getMetaClass().setProperty(this, prop, "BAR2");
    }

    public static void main(String[] args) {
        Test.metaClass.NEWATTRIBUTE = null

        def test = new Test()
        test.NEWATTRIBUTE = "MEOW1"
        println test.NEWATTRIBUTE   // prints BAR2


        test.setNEWATTRIBUTE("MEOW2")
        println test.NEWATTRIBUTE // prints BAR


        test.name = "MOOO"
        println test.name // prints BAR2

        test.setName("MOOO")
        println test.name // prints BAR
    }
}

事实证明,无论类是否实现setProperty(),都会调用GroovyInterceptable。但invokeMethod()仅在类实现GroovyInterceptable

时调用