問題タブ [dynamic-proxy]
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.
java - Java メッセージ ディスパッチャーで生の型を避ける
目的
サードパーティ API からのメッセージをユーザー定義メッセージに変換し、ユーザー登録リスナーにディスパッチする MessageDispatcher を構築しようとしています。
ユーザーには次のことが期待されます。
- ユーザー メッセージのタイプごとにインターフェイスを定義します。
- 各メッセージ タイプのメッセージ ディスパッチャーにリスナーを登録します。
- raw/サードパーティ データをメッセージ ディスパッチャに渡します。
- リスナーに返されるメッセージを処理します。
問題の説明
残念ながら、目的の API を実現するために生の型を使用することは避けられないようです。Raw 型を使用する例外的なケースはなく、下位互換性のために言語にのみ存在することを他の場所で読みました。
以下のコードを変更して機能させる方法はありますか、それとも API を再設計する必要がありますか?
インターフェース
MessageDispatcher は、次のインターフェースを実装します。
MessageListener インターフェースは次のように定義されています。
ユーザー メッセージの例は次のようになります。
リスナーの登録
ユーザーは次のようにリスナーを登録できます。
標準のメッセージ ディスパッチャは、次のようにメソッドを実装できます。
メッセージのディスパッチ
新しいメッセージが MessageDispatcher によって受信されると、オブジェクトの動的プロキシが作成され、適切なリスナーにディスパッチされます。しかし、これが私の問題です:
タイプを使用しようとすると、データをディスパッチできません。
リスナーが受け入れるデータのタイプと、リスナーに渡すデータのタイプを知る方法がないため、これは理にかなっています。
しかし、生の型を使用すると問題なく動作します:
c# - 動的プロキシ IEnumerable
特定のクラスのオブジェクトのリストへの動的プロキシを作成しようとしています。例えば:
しかし、次の例外が発生します。
メソッド System.Collections.Generic.IEnumerator`1[System.__Canon] GetEnumerator() を解決できません。メソッド ハンドル System.Collections.Generic.IEnumerable`1[T] の宣言型が汎用であるためです。宣言型を明示的に GetMethodFromHandle に提供します。
リスト自体を生成するための呼び出しをキャッシュするために、IEnumerable<> をプロキシしようとしています。
php - PHP:__callで親メソッドをオーバーライドする
親で定義されたメソッドに対して子クラスの__callマジックメソッドが呼び出されるように、何らかの方法で親メソッドを非表示にしたいと思います。例えば:
rename_functionとoverride_functionにチェックインしましたが、これらはメソッドでは機能しません。ReflectionMethodには私が試したsetAccessibleメソッドがありますが、これはReflectionMethodインスタンスを使用してメソッドを呼び出す場合にのみ機能するようです。
背景:PHPの型チェックを利用できるRPCプロキシクラスを作成しようとしています。したがって、RPCFooがある場合は、型ヒントまたはinstanceofを使用して、それを確認できるように型を強制できます($ RPCFooインスタンスFoo)。
編集:基本クラスは、プロキシなしでそのまま使用できる必要があります。これは、プロキシがコードではなくシステム構成の一部になるようにするためです。すべて同じコードベースを持つ複数のサーバーを考えてみてください。ただし、それぞれに特定のタスクを割り当てることができます。ローカルサーバーが要求されたサービスを処理しない場合、クラスローダーは基本クラスの代わりにプロキシを返します。ローカルサーバーが要求されたサービスを処理する場合、ローカルサーバーは基本クラスを返します。
もう一度編集:提示されたメソッドは実行可能ですが、基本クラスの設計されたインターフェイスをIDEとリフレクションから隠します。基本クラスから継承してプロキシインターフェイスを実装するだけで済むように、プロキシ実装をクリーンにしようとしていました。基本クラスのインターフェースを維持するために、プロキシ開発者は、リモート呼び出しを行うためにすべてのパブリックメソッドと保護されたメソッドを再実装する必要があります。次に、基本クラスで何かが更新されると、プロキシも更新する必要があります。結局、私は単に、リフレクションを使用するプロキシジェネレーターを作成するルートをたどり、開発者のためにこれを行うつもりだと思います。
返信ありがとうございます!
java - Java インターフェイス メソッドの呼び出しをインターセプトする
インターフェイスへのすべてのメソッド呼び出しの呼び出しをインターセプトする必要があります。Java Dynamic Proxies を試しましたが、役に立ちません。これが達成できるかどうかさえわかりませんが、確認することを考えました。
したがって、基本的には、次のようなインターフェイスがあるとしましょう。
Foo のどの実装からでも getValue() へのすべての呼び出しを傍受したいと思います。問題は、動的プロキシを使用できないため、Foo のさまざまな実装を制御できないことです。
これを行う方法はありますか?
ありがとう。
c# - 内部コンストラクターを使用して抽象クラスの動的プロキシを作成する
内部コンストラクターを持つ抽象クラスである BCL の型の動的プロキシを作成したいと思います。私は城の動的プロキシでしたが、これはパラメーターなしのコンストラクターがないことを示す例外で失敗します(それらは内部です)。
城でこれを達成する方法はありますか?そうでない場合、これを実行できる他の動的プロキシ フレームワークはありますか? これは開発の始まりなので、フレームワークを変更するのは簡単です。
wcf - 逆シリアル化中にサーバー上のプロキシ オブジェクトを使用する WCF
WCF の PUT 要求で変更されたプロパティを追跡しようとしています (SOAP ではなく REST を実行しています)。精査しようとしているという考えがありますが、このワンピースを乗り越えることはできません.
要求が入ってくるある時点で、ボディ (JSON、XML など) はオブジェクトに逆シリアル化され、後で WCF サービス メソッドに渡されます。
つまり、ある時点で、WCF は本質的にこのようなことをしているに違いありません。
User オブジェクトがプロキシ ジェネレーターから取得されるように、最初の行を変更したいと思います (のようにCastle.DynamicProxy
)。
これが可能かどうか誰にもわかりますか?たぶん、独自のデシリアライザーを作成する必要がありますか?
c# - 動的再試行プロキシ
以下を検討してください。
これに関する問題は、インターフェイスのすべてのメソッドに対してプロキシ メソッドを作成する必要があることです。特定のインターフェイスのすべてのメソッドに RetryOnException (またはその他のロジック) を適用できるように、より「動的な」ソリューションが必要です。現在、Castle DynamicProxy を検討していますが、他に選択肢がある場合はどうなりますか?
proxy - リバースプロキシ機能のあるプロキシサーバーを推奨
私のアプリケーションでは、サーバーとクライアントの両方が自分でホストされており、各クライアントには、接続するサーバーを構成できる構成があり、通信は HTTP に基づいています。ここで、クライアントの接続サーバーを動的に変更できるようにする必要がありますが、サーバーの URL 構成を変更するには、クライアントを再起動する必要があり、これには数分かかります。そのため、クライアントとサーバーの間に、いくつかのルールで異なるクライアントから別のサーバーにリクエストを転送できるプロキシ サーバーを追加したいと考えています。
プロキシ サーバーにはドメイン名が 1 つしかなく、クライアントのリクエスト URL にパラメーターを追加できないため、別のクライアントからのリクエストを区別できないため、リバース プロキシ サーバーを追加できません。
ただし、クライアントを変更して、プロキシを強制的に使用することはできます。
したがって、私の計画はクライアントにプロキシを設定し、クライアントごとに非現実的なサーバーの URL を指定し、プロキシ サーバーはリクエストでサーバーの URL を取得し、ルールに従ってリクエストを実際のサーバーに転送します。
そのようなことができるサーバーはありますか?当然のことながら、プロキシ サーバーを再起動せずにルールを変更できるとよいでしょう。
java - JDK動的プロキシとCGLibの違いは何ですか?
Proxy Design Patternの場合、JDK の Dynamic ProxyとCGLibなどのサードパーティの動的コード生成 API の違いは何ですか?
両方のアプローチを使用することの違いは何ですか?