Groovy 如何执行闭包?

Groovy 如何执行闭包?,groovy,Groovy,我对Groovy很陌生。我想知道Groovy中是如何实现闭包的 让我们说: def a = { println "Hello" } a() 当a()完成时,幕后到底发生了什么?a()调用哪个方法使闭包可执行 提前感谢。它最终调用了一个闭包。调用方法(在本例中为 关于这方面的更多信息基本上是: 闭包是一个具有特定名称的类 a()调用doCall(),它调用doCall(objectit)(闭包中的隐式it) acallsite包含方法名(2xprintln),并使用适当的参数调用 给你: 对

我对Groovy很陌生。我想知道Groovy中是如何实现闭包的

让我们说:

def a = { println "Hello" }
a()
a()
完成时,幕后到底发生了什么?
a()
调用哪个方法使闭包可执行


提前感谢。

它最终调用了一个
闭包。调用
方法(在本例中为

关于这方面的更多信息基本上是:

  • 闭包是一个具有特定名称的类
  • a()
    调用
    doCall()
    ,它调用
    doCall(objectit)
    (闭包中的隐式
    it
  • acallsite
    包含方法名(2x
    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);
    }
}

如何获得
a
的编码?@batman-
Groovy
被编译成
.class
文件,这些文件可以像
Java
编译类一样进行反编译。这是我用过的。