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