4

Proxy patternまたはDynamic Proxy Classesに似たものを探していますが、メソッド呼び出しが実際のオブジェクトで呼び出される前にインターセプトしたくないだけで、変更されているプロパティをインターセプトしたいだけです. プロキシが、異なるプロパティ セットを持つ複数のオブジェクトを表現できるようにしたいと考えています。Action Script 3 の Proxy クラスのようなもので十分です。

一般的に達成したいことは次のとおりです。

プログラム内の他のスレッドによって渡された値 (数値、文字列、オブジェクト) のリストを管理するオブジェクトで実行されているスレッドがあるため、クラスはチェックポイントの目的でディスク上に定期的に永続的なスナップショットを作成することができます。アプリケーション。この持続オブジェクトは、最後のチェックポイント以降に値のリストが変更されたかどうかを示す「ダーティ」フラグを管理し、ディスクへの書き込み中にリストをロックする必要があります。

パーシスタと他のコンポーネントは共通名で特定のアイテムを識別します。これにより、クラッシュから回復するときに、他のコンポーネントは最初にパーシスタに最新のコピーが保存されているかどうかを確認し、中断したところから作業を続けることができます。

通常の操作中に、永続化に渡されたオブジェクトを操作するために、元のオブジェクトのように見えるプロキシ オブジェクトへの参照を受け取りたいのですが、その値を変更するたびに、永続化たとえば、実際の値を実際に設定する前にアイテムまたはリストをダーティとしてマークするなど、通知してそれに応じて動作します。


編集: あるいは、Java に (PHP 5 のような) 一般的なセッター、つまり、プロパティが存在しない場合に呼び出されるメソッドがありますか? または、実行時にプロパティを追加できるオブジェクトのタイプはありますか?

4

4 に答える 4

3

「プロパティ」が JavaBean プロパティを意味する場合、つまり getter および/または setter メソッドを表す場合、動的プロキシを使用して set メソッドをインターセプトできます。

インスタンス変数を意味する場合は、Java レベルではできません。おそらく、バイトコードレベルでの操作によって何かができるかもしれません.

実際、これを行う最も簡単な方法は、おそらくAspectJを使用して set() ポイントカットを定義することです (これにより、バイト コード レベルでフィールド アクセスがインターセプトされます)。

于 2009-01-23T20:21:20.010 に答える
2

探している設計パターンは次のとおりです。差分実行。私は信じています。

差分実行はどのように機能しますか?

これに対処する私が答えた質問です。

ただし、代わりにコールバックを使用することをお勧めしますか? これについて読む必要がありますが、一般的な考え方は、「何か興味深い」ことが起こったときにアクティブになるインターフェイス (多くの場合、リスナーと呼ばれます) を実装できるということです。データ構造を変更するなど。

義務的なリンク:

Wiki差分実行

Wiki コールバック

わかりました、これが私が見たときの答えです。差分実行は O(N) 時間です。これは本当に合理的ですが、それがうまくいかない場合は、Callbacks がうまくいきます。コールバックは基本的に、配列を変更するクラスにパラメータでメソッドを渡すことによって機能します。このメソッドは、変更された値とアイテムの場所を受け取り、それをパラメーターで「ストレージ クラス」に戻し、値を適切に変更します。したがって、はい、メソッド呼び出しで各変更を元に戻す必要があります。

これはあなたが望んでいるものではないことに今気づきました。あなたが望むのは、そのアイテムが変更されたときに呼び出される配列内の各変数に、ある種のリスナーを提供できる方法です。次に、リスナーは「バックアップ」内の対応する配列を変更して、この変更を反映します。

本来、私はこれを行う方法を考えることができません。もちろん、インターフェイスを使用して独自のリスナーとイベントを作成することもできます。これは基本的にコールバックと同じ考え方ですが、見やすくなっています。

次に、リフレクションがあります... Javaにはリフレクションがあり、これを使用して何かを書くことができると確信しています。ただし、リフレクションは非常に遅いことで知られています。コーディングの手間は言うまでもありません (私の意見では)。

それが役立つことを願っています...

于 2009-01-23T20:18:34.087 に答える
1

メソッド呼び出しが実際のオブジェクトで呼び出される前にインターセプトするのではなく、変更中のプロパティをインターセプトしたい

実際、監視したいオブジェクトは便利な Bean ではなく、C 構造体の復活です。これを行う唯一の方法は、 JVMTI の Field Access 呼び出しを使用することです。

于 2009-01-24T00:58:33.727 に答える
1

自分も同じことをしたかった。私の解決策は、Javassist を使用して動的プロキシ ラッパーを使用することでした。ターゲット オブジェクトのクラスと同じインターフェイスを実装するクラスを生成し、プロキシ クラスを元のクラスにラップし、PropertyChangeEvent を起動するセッターを除いて、プロキシのすべてのメソッド呼び出しを元のクラスに委譲します。

とにかく、ここのブログに完全な説明とコードを投稿しました: http://clockwork-fig.blogspot.com/2010/11/javabean-property-change-listener-with.html

于 2010-11-13T13:24:08.090 に答える