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