groovy解析hello world

1742 ワード

彼の下位層がjvm上で実行されていることを知っているので、関数入口main関数があるはずです.そこで、classを逆コンパイルしてみました.
 
Dディスクの下で新規作成:Hello.groovy
 
println 'hello world'

 
groovyc Hello.groovy
ハローを生成するclass
 
逆コンパイル後:
 
import groovy.lang.Binding;
import groovy.lang.Script;
import org.codehaus.groovy.runtime.ScriptBytecodeAdapter;
import org.codehaus.groovy.runtime.callsite.CallSite;
import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;

public class Hello extends Script
{
  public Hello()
  {
    Hello this;
    CallSite[] arrayOfCallSite = $getCallSiteArray();
  }

  public Hello(Binding arg1)
  {
    Binding context;
    CallSite[] arrayOfCallSite = $getCallSiteArray();
    ScriptBytecodeAdapter.invokeMethodOnSuperN($get$$class$groovy$lang$Script(), this, "setBinding", new Object[] { context });
  }

  public static void main(String[] args)
  {
    CallSite[] arrayOfCallSite = $getCallSiteArray();
    arrayOfCallSite[0].call($get$$class$org$codehaus$groovy$runtime$InvokerHelper(), $get$$class$Hello(), args);
  }

  public Object run()
  {
    CallSite[] arrayOfCallSite = $getCallSiteArray(); return arrayOfCallSite[1].callCurrent(this, "hello world"); return null;
  }

  static
  {
    __$swapInit();
    Long localLong1 = (Long)DefaultTypeTransformation.box(0L);
    __timeStamp__239_neverHappen1330265162012 = localLong1.longValue();
    Long localLong2 = (Long)DefaultTypeTransformation.box(1330265162012L);
    __timeStamp = localLong2.longValue();
  }
}
 
まず、mainで無パラメトリック構造関数Helloを呼び出してHelloオブジェクトを生成し、run()メソッドを呼び出すべきである.他のオブジェクトはapiを見て、ソースコードで消化をゆっくり理解します.