2012-08-03 99 views
3

我對Groovy非常陌生。我想知道如何在Groovy中實現閉包。如何執行關閉?

比方說:

def a = { println "Hello" } 
a() 

a()做,什麼是真正幕後發生的事情? a()調用哪個方法使閉包可執行?

在此先感謝。

回答

4

基本上更多的信息:

  • 你的閉包是具有特定名稱的類
  • 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); 
    } 
} 
+0

你是怎麼了''的編碼? – batman 2012-08-04 08:17:54

+0

@batman - 'Groovy'被編譯成'可以反編譯像'Java'編譯的類.class'文件。這裏我使用了[Jad Decompiler](http://www.varaneckas.com/jad/)。 – Xeon 2012-08-04 09:56:25