Groovy 访问在trait中实现的invokeMethod()内的属性

Groovy 访问在trait中实现的invokeMethod()内的属性,groovy,metaprogramming,Groovy,Metaprogramming,下面的Groovy特性实现了GroovyInterceptable接口,以允许在方法调用之前和之后执行代码 trait Bar implements GroovyInterceptable { def bar = "bar" @Override invokeMethod(String name, Object args) { System.out.println(bar) metaClass.getMetaMethod(name, arg

下面的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() {
    }
}
下面的类实现trait
Bar

class Foo implements Bar {
}
看看下面的代码

def foo = new Foo()
foo.doSomething()
invokeMethod()
正在拦截对
doSomething()
的调用。发生
java.lang.StackOverflowerError
是因为访问
invokeMethod()
中的属性
bar
会隐式调用
bar
的getter,而
invokeMethod()
只是再次尝试访问
bar
时,就会拦截该属性

如何访问
invokeMethod
中的类属性而不调用该属性的getter或setter

与trait一起使用
this.@bar
访问属性不起作用

调用截获方法的代码
metaClass.getMetaMethod(name,args).invoke(this,args)
可能不正确,尽管它在类内直接使用trait逻辑时有效

编辑解决方案:

用户提供的被接受的答案在脚本环境中就像一个符咒。因为trait是一个更大项目的一部分,并且在它自己的文件中定义,所以我让它这样工作:

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() {
    }
}

事实证明,直接字段访问不需要使用
@

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()

试试这个。@bar?对于2.4.0,它工作正常。@Opal感谢您的快速回复。是的,它与
这个工具一起工作。@bar
。我认为示例不完整,我的问题稍微复杂一些,因此我编辑了示例代码。我可以将其添加为要接受的答案吗?@Opal如果您可以使其与示例代码中所示的特征结合使用,请确定:-)这看起来是正确的,因为我得到了这个异常:
MissingPropertyException:没有这样的属性:Bar\u类的Bar:de.appplant.workshop.data.Foo
Strange。它在我的机器上运行正常。是的,根据它的工作原理。我将Android Studio与Groovy 2.4.3一起使用。当作为脚本执行时,代码运行良好。当trait在它自己的文件中声明时,它会失败,出现上述异常:-/老实说,我只是尝试了
这个
@
.
的所有可能组合,希望代码的完成能给我一些提示-D