2008-12-19 67 views
2

用於攔截任意Groovy方法調用的ProxyMetaClass和Iterceptor類已有詳細記錄。有沒有辦法攔截財產訪問?當我嘗試通過攔截「的getProperty」要做到這一點,我仍然得到錯誤信息:如何使用ProxyMetaClass攔截Groovy中的屬性訪問?

groovy.lang.MissingPropertyException:沒有這樣的屬性:FOO

回答

1

我不能完全肯定的利用情況你正在努力解決,但可能你想要一個propertyMissinggetProperty (or maybe invokeMethod)

首先會讓你攔截財產的請求時,他們實際上並不在對象上存在:

class Person { 
    def name = "Ted" 
    def propertyMissing(String name) { "my $name" } 
} 

def p = new Person() 
assert "my address" == p.address 
assert "my email" == p.email 
assert "Ted" == p.name // property isn't missing 

第二個會讓你攔截所有的財產請求,甚至定義的屬性:

class Person { 
    def name = "Ted" 
    def getProperty(String name) { "my $name" } 
} 

def p = new Person() 
assert "my address" == p.address 
assert "my email" == p.email 
assert "my name" == p.name 

如果您使用的是現有類,則可以使用這些方法之一對其進行子類化,或者將這些方法添加到metaClass中:

String.metaClass.getProperty = { String name -> 
    return "String's property $name" 
} 

assert "String's property foo" == "".foo 
0

你的方法似乎是正確的。嘗試一些食譜here

抓住吸管:你調用的對象的方法真的是你已經元編程的類嗎?有時由於多態性,你沒有使用你認爲你是的類。