問題タブ [expandometaclass]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
class - Groovy クラスのプロパティをコピーする
オブジェクト プロパティを別のオブジェクトに一般的な方法でコピーしたい(プロパティがターゲット オブジェクトに存在する場合は、ソース オブジェクトからコピーします)。
私のコードはExpandoMetaClassを使用して正常に動作しますが、解決策が気に入りません。これを行う他の方法はありますか?
groovy - GMock を使用した複数の静的メソッドを持つ部分的なモッキング クラス
GMock を使用して、既存の Java プロジェクトに単体テストを追加しています。テストする必要があるメソッドが静的メソッドである複数の場所があり、テストしたいメソッド内で追加の静的メソッドを利用します。
クラスを部分的にモックできるようにしたいと思います。テスト用の最初のエントリ ポイント以外のクラスのほぼすべての静的メソッドです。
例えば:
2 番目の静的メソッドをモックできることを願っていますが、そうするとすぐに method(String) が MIA になり、テストの実行が期待例外で失敗します。クラスを部分的にモックして、最初のメソッドの機能を維持しながら、2 番目のメソッドの静的アクセスをモックする方法はありますか?
また、metaClass プログラミングを使用してメソッドをモックしようとしましたが、メソッドをクロージャーに等しく設定すると、最初のメソッドが再び MIA になります。オーバーロードされたメソッドでこれを行う方法がわかりません。何か案は?
groovy - JList toString メソッドを groovy expando メタクラスでオーバーライドして、groovy クラスのインスタンスを表示する
Groovy Swing アプリケーションでは、次のような教師を表すクラスがあります。
Docente.groovy
toString メソッドを使用して、JTable に教師の名前 (名詞付き) を他の特定の値と共に表示します。CRUD操作を実行するために、それらのいくつかをテーブルに表示し、残りをJDialogウィンドウに表示するというアイデアがあります。
sw が groovy の SwingBuilder オブジェクトのインスタンスであり、grdDocentes が JTable の ID であると仮定すると、次のコードを使用してそのテーブルにデータを入力します。
DocentesUI.groovy
ObtenerDocentes() は、データベースからすべての教師を取得するために使用するメソッドです。2 番目の列 (それ) は Docente インスタンス自体であり、予想どおり、toString() メソッドを呼び出す nombre プロパティが表示されます。オブジェクトの他のプロパティを取得する必要があるときはいつでも、このテーブルの 2 番目の列を取得するのが便利だと思うので、これを行います。
ここで、別のユーザー インターフェイスで、これらの教師を JList で表示したいと思いますが、形式は異なります。ここで metaClass の出番です。この別のインターフェースでは、Docente クラスの toString() をオーバーライドしたいと考えています。そのため、私は以下を使用します。
AsignarDocenteUI.groovy
ここで、lstDocentesDisponibles は JList の ID です。コードが println it.toString() 行に到達すると、オーバーライドされた toString() が使用され、デフォルトの出力ストリームに「no entiendo」が表示されます。しかし、JList を見ると、元の toString() が表示されます。ここで何が欠けていますか?
ヒントをいただければ幸いです。
ありがとう、
エドゥアルド。
unit-testing - 単体テスト用に Grails GORM ドメイン クラスでイベント クロージャをオーバーライドする
私は新しい Grails プロジェクトに取り組んでおり、最近、Spring Security Core で生成された User クラスのデフォルト規則が beforeInsert/Update イベントを介してパスワードを自動エンコードすることに気付きました。これは、エンコードを行うための優れたクリーンな DRY 方法であり、そうすることを忘れることもありません。
ただし、上記の User クラスを使用するいくつかの単体テストを作成しようとすると、(エンコードのために) springSecurityService をモック アウトするか、より好ましくは (そしてきれいに) オーバーライドする必要があることがわかります。何もしない beforeInsert/Update クロージャー。通常、Groovy では、ExpandoMetaClass を使用してメソッドをオーバーライドできます。
...しかし、新しいユーザーを作成して保存すると、元の beforeInsert が引き続き呼び出されることがわかりました。これにより、単体テストが爆発します。これを回避してサービスをモックアウトするのは簡単ですが、上記は機能するはずです。何か不足していますか?私が取り上げていないGORMのイベント閉鎖と何か違うことはありますか?
groovy - コンストラクターに渡されない、置き換えられた/オーバーライドされたパラメーターなしのメソッドの結果
プロパティを設定するために使用されるそのクラスのメソッドを置き換えることにより、グルーヴィーなクラスのコンストラクターの動作を変更しようとしていますが、プロパティが期待値に設定されていません。
java - Groovy の ExpandoMetaClass のスコープは?
Groovy は、ExpandoMetaClass
インスタンスおよびクラスのメソッド/プロパティを POJO に動的に追加できるようにする を公開します。これを使用して、Java クラスの 1 つにインスタンス メソッドを追加したいと思います。
これは、Fizz
クラスを次のようにリファクタリングすることと同じです。
私の質問:
doStuff(String blah)
これは のこの特定のインスタンスだけに追加されますFizz
か? それとも、Fizz
現在のすべてのインスタンスにdoStuff(String blah)
インスタンス メソッドがありますか?
前者の場合、インスタンス メソッドFizz
を持つすべてのインスタンスを取得するにはどうすればよいですか? doStuff
Groovyを作成した場合、次のことがわかります。
次にFizz
、 などの静的クラス メソッドを に追加しますFizz.doStuff(String blah)
が、それは私が望むものではありません。Fizz
のすべてのインスタンスに、 というインスタンス メソッドを持たせたいだけですdoStuff
。アイデア?
java - Groovy メタ プログラミングを使用して、Java クラスのプライベート メソッドをオーバーライドできますか
メタ プログラミングを使用して Java クラスのプライベート メソッドをオーバーライドしようとしています。コードは次のようになります。
問題は、doSomethingCrazyExpensive のオーバーライドされた実装が呼び出されないことです。これは、プライベート メソッドが init() メソッドによって内部的に呼び出され、metaClass を介して呼び出されないためだと思います。myProxy.doSomethingCrazyExpensive() を直接呼び出すと、オーバーライドされたメソッドが呼び出されるため、メタプログラミングはある程度機能します。
内部で呼び出されたときにオーバーライドされた実装が呼び出されるように、メタ プログラミングを使用して Java クラス (またはインスタンス) のメソッドをオーバーライドする方法はありますか?