首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Groovy $getCallSiteArray实现

Groovy $getCallSiteArray实现
EN

Stack Overflow用户
提问于 2021-06-04 01:14:35
回答 1查看 248关注 0票数 1

我使用的是groovy 2.4.12和Oracle JVM 1.8。我想了解一点groovyc是如何转换终端用户编写的脚本的。

为此,我编写了这个简单的脚本:

代码语言:javascript
复制
println 'Hello World`

这是使用groovyc hello.groovy编译成字节码的。最后,我对hello.class进行了反编译,得到以下代码:

代码语言:javascript
复制
import groovy.lang.Binding;
import groovy.lang.Script;
import org.codehaus.groovy.runtime.InvokerHelper;
import org.codehaus.groovy.runtime.callsite.CallSite;

public class hello extends Script {
    public hello() {
        CallSite[] var1 = $getCallSiteArray();
    }

    public hello(Binding context) {
        CallSite[] var2 = $getCallSiteArray();
        super(context);
    }

    public static void main(String... args) {
        CallSite[] var1 = $getCallSiteArray();
        var1[0].call(InvokerHelper.class, hello.class, args);
    }

    public Object run() {
        CallSite[] var1 = $getCallSiteArray();
        return var1[1].callCurrent(this, "Hello World");
    }
}

这看起来像一个典型的Java类,除了我不知道$getCallSiteArray()方法是在哪里定义的。它肯定不在这个类中,也不是groovy.lang.Scriptpublicprotected成员。所以我的问题是这个方法是在哪里实现的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-04 01:45:39

使用另一个反编译器查看它

代码语言:javascript
复制
// 
// Decompiled by Procyon v0.5.36
// 

public class A extends Script
{
    private static /* synthetic */ SoftReference $callSiteArray;
    
    public A() {
        $getCallSiteArray();
    }
    
    public A(final Binding context) {
        $getCallSiteArray();
        super(context);
    }
    
    public static void main(final String... args) {
        $getCallSiteArray()[0].call((Object)InvokerHelper.class, (Object)A.class, (Object)args);
    }
    
    public Object run() {
        return $getCallSiteArray()[1].callCurrent((GroovyObject)this, (Object)"hello world");
    }
    
    private static /* synthetic */ CallSiteArray $createCallSiteArray() {
        final String[] array = new String[2];
        $createCallSiteArray_1(array);
        return new CallSiteArray((Class)A.class, array);
    }
    
    private static /* synthetic */ CallSite[] $getCallSiteArray() {
        CallSiteArray $createCallSiteArray;
        if (A.$callSiteArray == null || ($createCallSiteArray = A.$callSiteArray.get()) == null) {
            $createCallSiteArray = $createCallSiteArray();
            A.$callSiteArray = new SoftReference($createCallSiteArray);
        }
        return $createCallSiteArray.array;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67825890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档