Groovy$getCallSiteArray实现
我将groovy 2.4.12与Oracle JVM 1.8一起使用。我试图了解一下Groovy$getCallSiteArray实现,groovy,Groovy,我将groovy 2.4.12与Oracle JVM 1.8一起使用。我试图了解一下groovyc如何转换最终用户编写的脚本 为此,我编写了以下简单脚本: println 'Hello World` 这是使用groovychello.groovy编译成字节码的。最后,我反编译了hello.class以获得以下代码: import groovy.lang.Binding; import groovy.lang.Script; import org.codehaus.groovy.runtime.
groovyc
如何转换最终用户编写的脚本
为此,我编写了以下简单脚本:
println 'Hello World`
这是使用groovychello.groovy
编译成字节码的。最后,我反编译了hello.class
以获得以下代码:
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()
方法。它肯定不在此类中,也不是public
或protected
的groovy.lang.Script
成员。所以我的问题是这个方法是在哪里实现的?使用另一个反编译器查看它
//
//由Procyon v0.5.36反编译
//
公共类A扩展脚本
{
私有静态/*合成*/SoftReference$callSiteArray;
公共A(){
$getCallSiteArray();
}
公共A(最终绑定上下文){
$getCallSiteArray();
超级(上下文);
}
公共静态void main(最终字符串…参数){
$getCallSiteArray()[0]。调用((对象)InvokerHelper.class,(对象)A.class,(对象)args);
}
公共对象运行(){
返回$getCallSiteArray()[1].callCurrent((GroovyObject)this,(Object)“hello world”);
}
私有静态/*合成*/CallSiteArray$createCallSiteArray(){
最终字符串[]数组=新字符串[2];
$createCallSiteArray_1(数组);
返回新的CallSiteArray((Class)A.Class,array);
}
私有静态/*合成*/CallSite[]$getCallSiteArray(){
CallSiteArray$createCallSiteArray;
如果(A.$callSiteArray==null | |($createCallSiteArray=A.$callSiteArray.get())==null){
$createCallSiteArray=$createCallSiteArray();
A.$callSiteArray=新的软引用($createCallSiteArray);
}
返回$createCallSiteArray.array;
}
}
使用另一个反编译器查看它
//
//由Procyon v0.5.36反编译
//
公共类A扩展脚本
{
私有静态/*合成*/SoftReference$callSiteArray;
公共A(){
$getCallSiteArray();
}
公共A(最终绑定上下文){
$getCallSiteArray();
超级(上下文);
}
公共静态void main(最终字符串…参数){
$getCallSiteArray()[0]。调用((对象)InvokerHelper.class,(对象)A.class,(对象)args);
}
公共对象运行(){
返回$getCallSiteArray()[1].callCurrent((GroovyObject)this,(Object)“hello world”);
}
私有静态/*合成*/CallSiteArray$createCallSiteArray(){
最终字符串[]数组=新字符串[2];
$createCallSiteArray_1(数组);
返回新的CallSiteArray((Class)A.Class,array);
}
私有静态/*合成*/CallSite[]$getCallSiteArray(){
CallSiteArray$createCallSiteArray;
如果(A.$callSiteArray==null | |($createCallSiteArray=A.$callSiteArray.get())==null){
$createCallSiteArray=$createCallSiteArray();
A.$callSiteArray=新的软引用($createCallSiteArray);
}
返回$createCallSiteArray.array;
}
}