访问在特征中实现的invokeMethod()内的属性

时间:2015-04-17 09:45:41

标签: groovy metaprogramming

以下Groovy特性实现了GroovyInterceptable接口,以允许在方法调用之前和之后执行代码。

trait Bar implements GroovyInterceptable {
    def bar = "bar"

    @Override
    invokeMethod(String name, Object args) {
        System.out.println(bar)
        metaClass.getMetaMethod(name, args).invoke(this, args)
    }

    def doSomething() {
    }
}

以下类实现特征Bar

class Foo implements Bar {
}

查看以下代码。

def foo = new Foo()
foo.doSomething()

doSomething()正在拦截对invokeMethod()的调用。发生java.lang.StackOverflowError是因为访问bar内的invokeMethod()内容会隐式调用bar的getter,而invokeMethod()只会尝试访问bar再次invokeMethod

如何在不调用此属性的getter或setter的情况下访问this.@bar内的类属性?

结合使用metaClass.getMetaMethod(name, args).invoke(this, args)访问该属性的特征不起作用。

调用截获方法的代码package com.example.project trait Bar implements GroovyInterceptable { def bar = "bar" @Override invokeMethod(String name, Object args) { System.out.println(this.com_example_project_Bar__bar) metaClass.getMetaMethod(name, args).invoke(this, args) } def doSomething() { } } 可能不正确,尽管在类中直接使用特征逻辑时它可以正常工作。

编辑解决方案:

用户Opal提供的接受答案就像脚本环境中的魅力一样。由于特征是较大项目的一部分并在其自己的文件中定义,因此我使其工作如下:

{{1}}

1 个答案:

答案 0 :(得分:1)

事实证明,无需使用@进行直接字段访问:

trait Bar implements GroovyInterceptable {
    def bar = "bar"

    @Override
    invokeMethod(String name, Object args) {
        System.out.println(Bar__bar)
        metaClass.getMetaMethod(name, args).invoke(this, args)
    }

    def doSomething() {
    }
}

class Foo implements Bar {
}

def foo = new Foo()
foo.doSomething()