2012-08-03 53 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