在特征中实现的 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()
以下 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()