2012-01-13 5 views
3

私はgroovyを学んでいます。私はそのメタプログラミング機能に関する質問があります。 Groovyのすべてのオブジェクトはgroovy.lang.GroovyObjectインタフェースを実装しています(groovyコンパイラによって暗黙的に追加されています)。後者のインターフェースはメソッドgetMetaClassを(含まれている)ので、私は次の操作を実行できます。groovyのjavaクラスのmetaClassプロパティ

class MyGroovyClass{ 
} 
def myGroovyClass = new MyGroovyClass(); 
println myGroovyClass.metaClass.name 

私は理解していない事がjava.lang.StringでのようなJavaコンパイラによってコンパイルされたオブジェクトは、メタクラスのプロパティを取得する方法です。このプロパティは、MetaClassRegistryを介してJavaクラスに関連付けられた実際のMetaClassオブジェクトで定義されていますか?

答えて

3

メタオブジェクト・プロトコルによって追加されたメソッドに加えて、Groovyは、groovy.runtime.DefaultGroovyMethodsクラスに定義されている追加のメソッドを使用してJDKのクラスも補強します。 Listなどのコレクションは、eachcollectのようなメソッドを取得します。同じメカニズムがgetMetaClassメソッドをjava.lang.Objectに追加します。

+0

しかし、groovy.runtime.DefaultGroovyMethodsで定義されているこれらのメソッドはどのように呼び出されますか? Groovyコンパイラは、明示的にjdkクラスへのメソッド呼び出しを探し、これらをインターセプトしてDefaultGroovyMethodsで定義されたメソッドを呼び出すバイトコードを生成しますか?これは、jdkで定義されたJavaクラスだけがgetMetaClass()メソッドを取得することを意味しますか? –

+0

@ JamesV.H。 Groovyオブジェクトには明らかにプロパティがあります。「メソッドを取得する」とはどういう意味ですか? –

+1

@DaveNewtonはい私はgroovyでコンパイルされたオブジェクトはプロパティを持っていることを理解しています。javaコンパイラでコンパイルされたクラスは明らかにプロパティを持っていませんが、依然としてmetaClassプロパティを呼び出すことができます。 Ataylorは、追加されたメソッドが(DefaultGroovyMehodsの)どこに定義されているのかをコメントしましたが、どのように関連付けメカニズムが動作するのかをコメントしていませんでした。 –

1

POJOの正しいメタクラスがレジストリで参照されています。

This presentationには、GroovyオブジェクトとPOJオブジェクトの両方でメタクラスがどのように使用されているかの概要が説明されています。

+1

リンクが壊れています:S – Hilikus

関連する問題