以下Groovy特性實現了GroovyInterceptable
接口,以允許在方法調用之前和之後執行代碼。訪問特性中實現的invokeMethod()內的屬性
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
是因爲訪問invokeMethod()
內部的屬性bar
隱式地調用了bar
的獲取者,而該又被invokeMethod()
攔截,只是試圖再次訪問bar
。
如何在不調用該屬性的getter或setter的情況下訪問invokeMethod
中的類屬性?
結合性狀使用[email protected]
訪問屬性不起作用。
調用截獲的方法的代碼metaClass.getMetaMethod(name, args).invoke(this, args)
可能是不正確的,儘管它在類中直接使用特徵邏輯時有效。
編輯的解決方案:
接受的答案貢獻的用戶Opal的作品就像一個腳本環境中的魅力。由於性狀是一個更大的項目的一部分,並在自己的文件中定義的我做了這樣的工作:
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() {
}
}
試試'這個。@ bar'?隨着2.4.0它正常工作。 – Opal
@Opal感謝您的快速回復。是的,它適用於'this。@ bar'。我想這個例子並不完整,我的問題稍微複雜一點,所以我編輯了示例代碼。 – EightBitBoy
我可以添加它作爲接受的答案嗎? – Opal