問題タブ [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.
c# - DynamicProxy::CreateClassProxyWithTarget でプロキシの二重構築を回避するには?
CreateClassProxyWithTarget
メソッドを使用して既存のオブジェクトを装飾しています。ただし、コンストラクター、つまり初期化コードが 2 回呼び出されています。私はすでに「構築された」インスタンス(ターゲット)を持っています。なぜこれが起こるのか理解していますが、空のコンストラクターを使用する以外に回避する方法はありますか?
編集:ここにいくつかのコードがあります:
最初にプロキシを作成します:
たとえば、次のクラスのオブジェクトでこれを使用します。
私が今呼び出すと、BindingFactory.Create(someKatalogBaseObject);
プロパティ
は再び初期化されます。Values
Attributes
c# - 動的プロキシを POCO に変換するにはどうすればよいですか?
ドメイン モデルをシリアル化しようとしていたときに、動的プロキシを POCO に変換する必要があるという問題に遭遇しました。私が遭遇した問題は、モデル内の仮想プロパティを介して循環参照が存在することでした。[ScriptIgnore]
シリアライザーがこれらのプロパティを解析しないようにするために使用しようとしましたが、それでも解析されます。これは、オブジェクトが動的プロキシであり、パーサーが入る原因となるプロパティにまだいくつかの残りがあるためだと思います(これにより、再帰エラー「循環参照」が発生します-再帰を3ステップに制限しようとしましたが、取得しました「再帰ステップを超えました」のエラー)。
オブジェクトを動的プロキシから POCO に変換してシリアライズできるようにするにはどうすればよいですか?
編集:簡単な例
spring - 生成されたSpring動的プロキシはどこに保存されますか?
Springフレームワークによって生成された動的プロキシ(バイトコード)が保存/保持されている場所を教えてもらえますか?
ファイルシステム上?メモリ内ですか?
c# - .Net のサードパーティ ライブラリから/への非仮想メソッドへの呼び出しをインターセプトする方法は?
私が必要としているのは、.net の人々が「透過的な動的プロキシ」と呼ぶものだと思いますが、これまでに見たすべての実装 (Castle DynamicProxy、Spring.NET AOP など) では、少なくとも次のいずれかを実行する必要があります。
- インターセプトされたメソッドを仮想として宣言する
- クラスをラップし、ラップされたクラスの代わりにラッパーのインスタンスを作成します
- 継承の変更またはインターフェイスの実装
明らかに、呼び出し元と呼び出し先の両方が非仮想であり、サードパーティのクローズド ソース ライブラリからのものである場合、私にできることは何もありません。
C# が Python のような動的言語である場合、次のようにします。
これは、ThirdyPartyLibB.Bar と対話しているときに ThirdyPartyLibA.Foo の悪い動作を変更するために必要です。この動作の原因と、逆アセンブラーのおかげでこのバグを修正するために Foo または Bar を変更する方法を正確に知っています。
いくつかの (ほとんど機能しない) アイデア:
- ThirdyPartyLibA を逆アセンブルし、コードに変更を加えて、互換性のあるアセンブリを生成します (厳密な名前のアセンブリであるため、機能しない可能性があります)。
- バイナリを編集してFooのバグのあるメソッドを仮想化し、有効なアセンブリを維持するために必要なものをすべて変更して、動的プロキシを使用できるようにします(上記のアイデアと同じ理由により、機能する可能性はほとんどありません)
- 適合する透過的な動的プロキシの実装を見つけます (このフォーラム スレッドに基づくものはないと思います: http://www.pcreview.co.uk/forums/overriding-non-virtual-methods-using-il-and-reflection-エミット-t2605695.html )
- ライブラリを作成した会社に連絡してください (その会社は製品をサポートしていません)。
- ライブラリの使用を中止するか、別の方法を使用してください (IDE 独自の言語を使用して書かれた膨大な量のコードがあるため、RAD IDE のランタイムの一部であるため不可能です)。
- 問題のあるメソッドの呼び出しを制御して、バグを回避します (既にこれを実行しましたが、問題を完全に解決することはできませんでした)。
他に何か考えはありますか?
PS: 下手な英語で申し訳ありません。また、私のPythonで申し訳ありません。このコードは、私が必要とするものを説明するためのものです。恐ろしいので、レシピと見なさないでください。
castle - Castleを使用した自己プロキシコンストラクタ?
クラスのコンストラクターがプロキシをそれ自体にラップすることは可能ですか? 残念ながら、このコードは StackOverflowException を引き起こします。
プロキシされたインスタンスを作成するある種のファクトリを作成する代わりに、クラスの新しいインスタンスがプロキシにラップされることを保証する何らかの方法が必要です。
java - JsonがJacksonライブラリを使用してJDK動的プロキシをシリアル化する
Jacksonライブラリを使用してJavaDynamicプロキシをシリアル化しようとしていますが、次のエラーが発生します。
この例外が発生します:
問題は、Hibernateプロキシオブジェクトがシリアル化されたときに発生する問題と同じように見えますが、Jackson-hibernate-moduleを使用して問題を解決する方法と方法がわかりません。
更新:バグはJackson2.0.6リリースから解決されました
namespaces - NSubstitute を参照するアセンブリで DynamicProxy タイプを使用する場合の「両方のアセンブリにタイプが存在する」エラーを修正する方法は?
DynamicProxy 3.1 を使用してランタイム インターセプトを行うアプリケーションがあります。モックにNSubstituteを使用するテスト アセンブリがあります。完全にブートストラップされたコンテナー (StructureMap を使用して傍受を行う) に対していくつかの「統合」テストを作成InterceptWith
したので、コンテナーから出てくる特定の型が適切にプロキシされていることを確認できます。
ただし、DynamicProxy 参照もNSubstitute アセンブリ内にあることを示すこのエラーが表示されます。(それは溶けているように見えます)。
この紛争の周りにとにかくありますか?
java - Spring と Java で動的プロキシを作成する方法
私はこの状況を持っています: すべてのサービス インターフェイスを集約する 1 つのインターフェイス サービスがあります。たとえば、ILoginService1 と ILoginService2 の 2 つのインターフェイスがある場合、Service インターフェイスは次のようになります。
次のような特定のコンテキストでこのインターフェイスにアクセスできるようにする必要があります。
これが私の解決策です( http://artofsoftwarereuse.com/tag/dynamic-proxy/に似たもの):
Service インターフェイスに配置する 1 つの注釈 ServiceFacade を作成し、Service インターフェイスの DynamicProxy を作成する BeanPostProcessor を用意します。しかし、問題は、@Component を配置した場合でも、Spring コンポーネント スキャンから Service インターフェイスが取得されず、他のコンポーネントが Spring コンテナーに配置されることです。
これまでの解決策を修正するにはどうすればよいですか、何か不足していますか、または他の解決策はありますか? ソースコードは次のとおりです: applicationContext.xml
注釈:
動的プロキシの呼び出しハンドラ:
BeanPostProcessor クラス:
したがって、私の問題は構成ではありません。私の問題は、BeanPostProcessor によってキャッチされ、動的プロキシを作成するために、サービス インターフェイスをスプリング コンテナーにアタッチする方法です。これまでのところ、何かが足りないかもしれませんが、誰かがそれを行うより良い方法を持っている場合は、今すぐ許可してください。前もって感謝します
解決:
BeanPostProcessor とアノテーションも削除する必要があります。
java - 動的プロキシが互換性のあるインターフェースにキャストできるようにします。関係なく
クラス内の特定のメソッドを処理する際の仲介者となるように動的プロキシを作成しました。これは、制御する必要がある各インターフェイスのすべてのメソッドをオーバーライドする必要がないようにするためです。
ワッフリーは、誰も理解したり気にしたりしないだろうと言っています(ただし、質問にさらにコンテキストを追加する可能性があります):
これから紹介する例では、コンパイルして自分でテストおよび実行できるように、汎用的にしようとしましたが、実際の状況では、次のようなものがあります。
インスタンスのプロキシを作成するConsoleCommandSender
場合、結果のプロキシはCommandSender
. 実際には、ConsoleCommandSender
すべてのインターフェースをリストしていないため、次のgetInterfaces()
ことが起こります。
java.lang.ClassCastException: $Proxy18 cannot be cast to org.bukkit.command.CommandSender
Player クラスにはこの問題はなく、常に にキャスト可能CommandSender
です。
本当の質問:
したがって、次のコードを出発点として使用すると、 で示されるプロキシmyProxy
を、ClassCastException
.
次のコードは正常にコンパイルおよび実行されますがList
、. ではなくArrayList
.
<T>
この問題の予備的な部分について私が作成した別のスレッドで、ある人が、変数を使用して別の有効なインターフェイスをリストに追加できるとコメントしました。これを実装する方法はよくわかりませんでしたが、良いスタートのように思えました。
java - Javaで動的プロキシを作成すると、OSXに焦点が当てられます
動的プロキシ(java.lang.reflect.Proxy)を作成すると、OS X(少なくとも10.7および10.8)は、プロキシを作成したJavaアプリケーションに焦点を合わせます。
私が作成したプロキシは、外部プロセスを開始するオブジェクトをラップします。この外部プロセスはフォーカスを持っていることを期待しており、Javaプロセスがフォーカスを盗むと物事は失敗します。
OS XがJavaプロセスをドックにプロモートしているように見えます。これが、他のアプリケーションからフォーカスを奪う理由です。誰かがこれを防ぐ方法を知っていますか?