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

Access a property inside invokeMethod() implemented in a trait

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

以下 class 实现了特征 Bar

class Foo implements Bar {
}

看看下面的代码。

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

doSomething() 的调用正被 invokeMethod() 拦截。出现 java.lang.WhosebugError 是因为访问 invokeMethod() 内的 属性 bar 隐式调用了 bar 的 getter,后者又被 invokeMethod() 只是想再次访问 bar

如何在不调用此 属性 的 getter 或 [=57 的情况下访问 invokeMethod 中的 class 属性 =]?

结合使用 this.@bar 的特征来访问 属性 不起作用。

调用拦截方法的代码 metaClass.getMetaMethod(name, args).invoke(this, args) 可能不正确,尽管它在直接在 class.

中使用特征逻辑时有效

编辑解决方案:

用户 Opal 贡献的被接受的答案在脚本环境中就像一个魅力。由于 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()