2

とりわけ.NETでのAOPを扱う修士論文を書いていますが、現在.NET AOPフレームワークがないという事実の重要な要因として、ロード時にクラスを置き換えるためのサポートがないことに言及しています。真の動的ウィービングを実行します-ウィービングクラスがインターフェイス上ですべてのセマンティクスを拡張ContextBoundObjectまたはMarshalByRefObject公開する必要があるという要件を課すことなくではありません。

ただし、次のおかげで、JVMのJavaでこれを行うことができますClassFileTransformer

  • を拡張しClassFileTransformerます。
  • クラスロードイベントをサブスクライブします。
  • クラスのロード時に、クラスを書き直して置き換えます。

これはすべて非常にうまくいっていますが、私のプロジェクトディレクターは、最後の最後に、クラス置換をサポートする/サポートしないフレームワーク(および関連する言語)のリストを提供するように私に依頼しました。私は今、これを探す時間が本当にありません。表面的な調査を行って、論文に誤った情報を入れる可能性があるだけでは、気が進まないでしょう。

だから私はあなたに尋ねます、ああ全能のプログラミングコミュニティ、あなたは助けることができますか?もちろん、私はあなたにこれを自分で研究するように求めているのではありません。簡単に言うと、特定のフレームワークがこれをサポートしている/サポートしていないことが確実にわかっている場合は、それを答えとして残してください。よくわからない場合は、忘れずに指摘してください。

本当にありがとう!


編集:@ewernli

  • (2)についてお伺いします。
  • C#では、実行時にコードを出力して新しいクラスを動的に作成できますが、これらは新しいクラスであり、既存のクラスを置き換えるものではありません。私がやりたいのは、Javaで.を使用して実行できるように、ロード時にクラスを変換することですClassFileTransformer
  • メソッドのシグネチャの変更について:はい、その通りです。私の場合、クラスのインターフェースを変更するのではなく、そのメソッドのコンテンツを変更する必要があることを述べておかなければなりません。

あなたの答えは本当に役に立ちました。ありがとうございました :)

4

4 に答える 4

4

(1)実行時の真のクラス置換、(2)ロード時にクラスを変換する機能、または(3)動的クラスロードをサポートする言語について質問していますか?

Javaは、を使用した動的クラスのロード、を使用しClassLoaderた変換をサポートしClassFileTransformerていますが、真のクラス置換はサポートしていません。

C#についてはよくわかりませんが、実行時にコードを出力して新しいクラスを動的に作成できるので、(3)とおそらく(2)を達成できると思います。

真のクラス置換は、ほとんどの場合、動的言語、たとえばSmalltalk、Ruby、Pythonなどのいくつかでのみサポートされています。これには、新しい形状に一致するようにクラスのインスタンスを変換する必要があります。クラスが変更された場合、通常、新しいフィールドをnilに初期化します。

AFAIK、JVMに移植された動的言語は、実行時のクラス置換をサポートするためにClassLoaderの広範なハッキングを行います。JRubyについては、動的呼び出しの最初のテイストを参照して、現在どのように実行するか、問題があること、および今後どのようにinvokedynamic役立つかについて、より多くのポインターを取得してください。

型システムが複雑なため、これは静的に型付けされた言語では提供されません。クラスでメソッドシグネチャが変更された場合、すでにロードされている他の既存のクラスは、安全ではない新しいメソッドシグネチャに準拠する必要がない場合があります。ただし、Javaでは、 Java Platform Debugger Architectureを使用して署名が同じである限り、メソッドを変更できます。

この機能をJavaや静的に型付けされた言語に追加する試みがいくつかありました。

  • タイプセーフな動的Javaクラスのランタイムサポート
  • アプリケーション動作の予期しない動的適応のサポート
  • Javaソフトウェアの動的更新の手法

このペーパーでは、関連する問題の概要を説明します

  • 動的ソフトウェアの進化に対する型システムの影響

それがあなたの最初の質問に対応しているかどうかは正確にはわかりませんが、これらのポインタはとにかくあなたの論文にとって興味深いかもしれません。

于 2010-06-15T08:49:29.387 に答える
2

Java言語は、クラス ファイルの置換をサポートしていません。JVM は、言及したクラスを介して機能を公開します。したがって、JVM に移植されたすべての言語で、JVMを利用できます。

于 2010-06-15T08:18:03.747 に答える
1

Erlangはホットコードスワッピングをサポートしており、動的なクラス更新をモデル化する理論的なフレームワークも探している場合は、Creol言語(解釈済み)を確認できます。

于 2010-06-15T09:12:46.717 に答える
1

Objective-C のランタイム ライブラリは、クラスの動的な構築と登録、遅延メソッド登録、実行時にメソッドの実装を切り替えることができる「メソッド スウィズリング」をサポートしています。以前のバージョンでは、実行時にクラスを別のクラスに置き換えることができる「クラス スウィズリング」がサポートされていましたが、代わりにメソッド スウィズリングが使用されるようになりました。参考ドキュメントはこちら。

于 2010-06-15T09:34:39.140 に答える