2

まず第一に、私がこの質問への答えを研究しなかったので私が明白なことを言うならすみません、それはただ頭に浮かんだものであり、グーグル検索で答えを見つけることができませんでした(私もGroovyを知りません良い)。

Groovyの動作(第1版)を読んでいて、セクション7.6で、「通常のJavaクラスをGroovyクラスとして認識したい場合は、GroovyObjectインターフェイスを実装するだけで済みます。便宜上、サブクラス化することもできます。デフォルトの実装を提供する抽象クラスGroovyObjectSupport。」

だから私はいくつかのJava/Groovyを試しています(Javaでのコーディングをより速く/より簡単にする方法を見つけようとしています)そして私はこのオブジェクトをインスタンス化していますPersonはJavaオブジェクトであり、Personクラスは何の関係もありませんGroovy(つまり、GroovyObjectなどを実装していません)。人には、ゲッター/セッターを含む保護されたフィールド、名前があります。groovyテストケース(GroovyTestCaseを拡張)でこのようにアクセスできます。これは別のパッケージに含まれているため、次のようにアクセスすることはできません。

Person person = new Person('joe')
println "Name: ${person.name}"

Groovyオブジェクトが持つメタ情報を使用するのではありませんか?つまり、Groovyはインターセプトし、「person.name」の「name」部分を取得して、getName()メソッドなどを呼び出しますか?しかし、personはJavaオブジェクトです...つまり、そのロジックを使用できるようにするべきではありません。

GroovyObjectまたは拡張GroovyObjectSupportを実装していませんが、このJavaオブジェクトには使用できるGroovy機能があるようです。

私の質問は、Groovyで使用されるJavaオブジェクトから何を推測できるかということです。明らかに、いくつかのGroovy機能でJava定義クラスを拡張するために、舞台裏で何かが行われています...しかし、どの機能ですか?

つまり、私の質問は、「Groovyコンテキスト内で使用するとJavaクラスはどうなるのか」ということになります。

主題に関するどんな情報でもありがたいです、ありがとう:)

4

2 に答える 2

4

Groovyは確かにJavaクラスを強化します。問題は、Javaからこれらの拡張Javaクラスを使用する場合です。GroovyObject次に、とGroovyObjectSupport戦略に進む必要があります。

期待できることについては、Groovyのドキュメントを確認できます。

  • groovy-jdkは、JDKに対するGroovyの機能強化を示しています
  • groovy-apiは、Groovyライブラリに固有のものを表示します

また、Eclipseプラグインは、GroovyからJavaクラスを自動補完するのに最適です。


Javaオブジェクトは、Groovyのメタオブジェクトプロトコル(MOP)によって拡張されます。これは、メソッドと属性をインターセプトして独自にディスパッチします。これが、ものをインターセプトできる理由であり、Javaの最終クラスに新しいメソッドが追加される方法です。

GroovyのMOPは、キャッシュされた戦略とリフレクタークラスを使用して、優れたパフォーマンスを実現します。

于 2012-11-22T19:36:18.793 に答える
1

また、resolveClassメソッドをオーバーライドし、クラスローダーを変更することで、ObjectInputStreamを介してGroovyオブジェクトを読み取ることもできます。http://www.feiteira.org/2013/04/reading-groovy-objects-from-java.htmlを参照してください

于 2013-04-30T16:24:48.867 に答える