Groovy 访问在trait中实现的invokeMethod()内的属性
下面的Groovy特性实现了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
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() {
}
}
下面的类实现traitBar
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