這個問題可能已經在評論中得到了回答,但我更深入地挖掘了一下,以回答「groovy源代碼中的什麼點」部分。
當你的tester
的實例調用getProperties()
的Groovy會做它的魔力,最後調用DefaultGroovyMethods#getProperties(Object)
這(在Groovy 2.4.7)看起來是這樣的:
public static Map getProperties(Object self) {
List<PropertyValue> metaProps = getMetaPropertyValues(self); // 1
Map<String, Object> props = new LinkedHashMap<String, Object>(metaProps.size());
for (PropertyValue mp : metaProps) {
try {
props.put(mp.getName(), mp.getValue()); // 2
} catch (Exception e) {
LOG.throwing(self.getClass().getName(), "getProperty(" + mp.getName() + ")", e);
}
}
return props;
}
首先,Groovy中確定的元屬性給定的對象(見1)。這將返回三個屬性:
var
:吸氣劑只(getVar()
),沒有setter,沒有實地
class
:唯一吸氣劑(從Object
繼承),沒有setter,沒有實地
count
:吸氣, setter(均由Groovy生成)和字段
您可以通過致電t.getMetaPropertyValues()
輕鬆驗證此內容。
接下來,Groovy嘗試獲取每個屬性的當前值並將其放入一個映射中(請參閱2)。當它達到var
時,它記得var
有一個吸氣劑(即getVar()
)並調用它。然而,getVar()
又會返回var
。對於Groovy來說,這與第一步中確定的屬性完全相同。再一次,它調用它的getter getVar()
並且無限循環開始。
在某一點上,根據不同的JVM,這導致StackOverflowError
,這正是這個網站是所有關於:-D
很奇怪。我只是在Groovy的Web控制檯http://groovyconsole.appspot.com/上試過這個,我看到它執行了110次。 –
這是因爲這行'return var'。這實際上是在遞歸中調用'getVar()'本身,因爲'return var'與調用'return getVar()'相同。它會打印計數,直到堆棧溢出。 – dmahapatro
'return var'是問題所在。 –