どのフレームワーク(および関連言語)がクラスの交換をサポートしていますか?
-
27-09-2019 - |
質問
私はマスター論文を書いています。それは.NETのAOPを扱っています。真のダイナミック織りを実行する - 織りクラスが拡張する必要があるという要件を課さないでください ContextBoundObject
また MarshalByRefObject
または、すべてのセマンティクスをインターフェイスに公開します。
ただし、JVMでJavaでこれを行うことができます。 ClassFileTransformer
:
- あなたは拡張します
ClassFileTransformer
. - クラスロードイベントを購読します。
- クラスの負荷で、クラスを書き換えて交換します。
これはすべて非常にうまくいっていますが、私のプロジェクトディレクターは、最後の最後に、クラスの交換をサポート /しないフレームワーク(および関連言語)のリストを彼に提供するように頼みました。私は今これを探す時間が本当にありません:私は表面的な研究をして、私の論文に誤った情報を潜在的に掲載する可能性があるだけで快適ではありません。
だから私はあなたに尋ねます、ああ全能のプログラミングコミュニティ、あなたは手伝ってもらえますか?もちろん、私はあなたにこれを自分で調査するように頼んでいません。単純に、あなたが知っているなら 確かに 特定のフレームワークがこれをサポート /サポートしていないことは、それを答えとして残してください。よくわからない場合は、それを指摘することを忘れないでください。
本当にありがとう!
編集:@ewernli
- (2)について尋ねています。
- C#では、実際に実行時にコードを発し、動的に新しいクラスを作成できますが、 新着 クラスでは、既存のクラスを置き換えません。私がやりたいのは、あなたがJavaでできるように、ロード時にクラスを変換することです
ClassFileTransformer
. - メソッドの署名の変更について:はい、あなたは正しいです。私の場合、クラスのインターフェイスを変更したくないのではなく、そのメソッドの内容を変更したいと言わなければなりません。
あなたの答えは本当に役に立ちました。ありがとうございました :)
解決
(1)実行時の真のクラスの交換、または(2)ロードされたときにクラスを変換するための施設について質問していますか、それとも動的クラスの読み込みをサポートする言語ですか?
Javaは、動的クラスの読み込みをサポートします ClassLoader
, 、との変換 ClassFileTransformer
, 、しかし、真のクラスの交換はありません。
C#はわかりませんが、実行時にコードを発射して動的に新しいクラスを作成できると思います。
真のクラスの交換は、ほとんどによってのみサポートされています 動的言語, 、例:Smalltalk、Ruby、私はPythonと他のいくつかを推測します。これには、新しい形状に合わせてクラスのインスタンスの変換が必要です。クラスが変更された場合、通常、新しいフィールドをゼロに初期化します。
JVMに移植されたダイナミック言語は、クラスローダーの広範なハッキングを行い、実行時にクラスの交換をサポートします。 Jrubyについては、参照してください Invoke Dynamicの最初の味 彼らが今どのようにそれをしているか、何が問題なのか、そして今後の方法をより多くのポインターを得るために invokedynamic
役立つかもしれません。
これは、の複雑さのために静的にタイプされた言語では提供されません タイプシステム. 。メソッドの署名がクラスで変更された場合、既にロードされている他の既存のクラスは必要ない場合があります。 Javaでは、署名が同じである限り、メソッドを変更できます。 Javaプラットフォームデバッガーアーキテクチャ.
この機能をJavaに追加しようとする試み、および/または静的にタイプされた言語がありました。
- タイプセーフダイナミックJavaクラスのランタイムサポート
- アプリケーション動作の予期しない動的適応をサポートします
- Javaソフトウェアの動的更新の手法
この論文は、関連する問題の一般的な概要を提供します
- 動的ソフトウェアの進化に関するタイプシステムの影響
その最初の質問にその扱いをしているかどうかは正確にはわかりませんが、これらのポインターはとにかくあなたの論文にとって興味深いかもしれません。
他のヒント
Java 言語 クラスファイルの交換をサポートしません。 JVMは、言及したクラスを介して機能を公開します。したがって、すべて JVMに移植された言語 それを利用することができます。
Objective-Cのランタイムライブラリは、クラスの動的な構築と登録、レイジーメソッド登録、およびランタイム時にメソッドの実装を切り替えることができる「メソッドスウィズリング」をサポートします。以前のバージョンは、クラスを実行時に別のものに置き換えることができる「クラススウィズリング」をサポートしましたが、代わりにメソッドスウィズリングが使用されます。 これが参照ドキュメントです。