Groovyは単にメソッドを「呼び出す」のではなく、メタオブジェクトプロトコルを介してメソッドをディスパッチします。メソッド呼び出しは、オブジェクトにメッセージとして送信され、オブジェクトはそれに応答するかどうかを決定できます。動的型付けを使用する場合、オブジェクトタイプは、そのメッセージに応答する場合にのみ重要です。これはダックタイピングと呼ばれます。
Groovyコードを逆コンパイルすると、(簡単ではありませんが)それを確認できます。groovyc
他のツールを使用してコンパイルおよび逆コンパイルできます。jd-guiをお勧めします。Groovyのメソッドキャッシングのため、メソッドが明示的に呼び出されていることはわかりません(Groovyの優れたパフォーマンスを実現するためにこの方法で実行されます)。
次のような単純なスクリプトの場合:
def a = "abcdefg"
println a.substring(2)
これが生成されたコードになります:
CallSite[] arrayOfCallSite = $getCallSiteArray(); Object a = "abcdefg";
return arrayOfCallSite[1].callCurrent(
this, arrayOfCallSite[2].call(a, Integer.valueOf(2))); return null;
また、メソッド呼び出しは、直接呼び出されるのではなく、オブジェクトに「ディスパッチ」されます。これは、SmalltalksおよびRubyメソッドディスパッチと同様の概念です。Groovyオブジェクトのメソッドとプロパティアクセスをインターセプトできるのは、そのメカニズムのためです。
Groovy 2以降、Groovyコードは静的にコンパイルできるため、コンパイラーのように機能します。