3
我對Groovy非常陌生。我想知道如何在Groovy中實現閉包。如何執行關閉?
比方說:
def a = { println "Hello" }
a()
時a()
做,什麼是真正幕後發生的事情? a()
調用哪個方法使閉包可執行?
在此先感謝。
我對Groovy非常陌生。我想知道如何在Groovy中實現閉包。如何執行關閉?
比方說:
def a = { println "Hello" }
a()
時a()
做,什麼是真正幕後發生的事情? a()
調用哪個方法使閉包可執行?
在此先感謝。
基本上更多的信息:
a()
doCall()
調用它調用doCall(Object it)
(隱式在閉包)acallsite
0包含方法名(2×println
) - 並用適當的參數在這裏你去調用:
對於這個Groovy腳本:
def a = { println "Hello"; println "Hello2" }
a()
封閉a
看起來是這樣的:
class Test$_run_closure1 extends Closure
implements GeneratedClosure
{
public Object doCall(Object it)
{
CallSite acallsite[] = $getCallSiteArray();
acallsite[0].callCurrent(this, "Hello");
return acallsite[1].callCurrent(this, "Hello2");
}
public Object doCall()
{
CallSite acallsite[] = $getCallSiteArray();
return doCall(null);
}
protected MetaClass $getStaticMetaClass()
{
if(getClass() != Test$_run_closure1)
return ScriptBytecodeAdapter.initMetaClass(this);
ClassInfo classinfo = $staticClassInfo;
if(classinfo == null)
$staticClassInfo = classinfo = ClassInfo.getClassInfo(getClass());
return classinfo.getMetaClass();
}
public static void __$swapInit()
{
CallSite acallsite[] = $getCallSiteArray();
$callSiteArray = null;
}
private static void $createCallSiteArray_1(String as[])
{
as[0] = "println";
as[1] = "println";
}
private static CallSiteArray $createCallSiteArray()
{
String as[] = new String[2];
$createCallSiteArray_1(as);
return new CallSiteArray(Test$_run_closure1, as);
}
private static CallSite[] $getCallSiteArray()
{
CallSiteArray callsitearray;
if($callSiteArray == null || (callsitearray = (CallSiteArray)$callSiteArray.get()) == null)
{
callsitearray = $createCallSiteArray();
$callSiteArray = new SoftReference(callsitearray);
}
return callsitearray.array;
}
static Class _mthclass$(String s)
{
try
{
return Class.forName(s);
}
catch(ClassNotFoundException classnotfoundexception)
{
throw new NoClassDefFoundError(classnotfoundexception.getMessage());
}
}
private static ClassInfo $staticClassInfo;
public static transient boolean __$stMC;
private static SoftReference $callSiteArray;
static
{
__$swapInit();
}
public Test$_run_closure1(Object _outerInstance, Object _thisObject)
{
CallSite acallsite[] = $getCallSiteArray();
super(_outerInstance, _thisObject);
}
}
它最終調用的Closure.call
方法之一(在這種情況下,one with no args)
有一個關於這個in the documentation
你是怎麼了''的編碼? – batman 2012-08-04 08:17:54
@batman - 'Groovy'被編譯成'可以反編譯像'Java'編譯的類.class'文件。這裏我使用了[Jad Decompiler](http://www.varaneckas.com/jad/)。 – Xeon 2012-08-04 09:56:25