7

私は現在、ASM ライブラリを介して動的なバイト コード変更ルーチンを多用するプラットフォームに取り組んでいます。配列クラスとは別に、必要なすべてのシステム クラスを正常にインスツルメントすることができました。(つまり、String[]、int[] など) これは、配列クラス自体が動的な型であるため、実際には rt.jar に計測するクラス ファイルがないためです。

ただし、配列型でさえ java.lang.Object を拡張することが判明したため、Object クラスを変更することは理想的ではありませんが、少なくとも変更がすべてのサブクラスに伝播されるため、可能になる可能性があります。ちなみに、私が達成しようとしているのは、配列クラスに追加のプリミティブ フィールドを間接的に追加することです。

私が言及した明らかな警告は別として、これにより他のプラットフォーム関連の問題が発生しますか?

4

2 に答える 2

4

Objectをインストルメント化する代わりに、最も簡単な方法は、選択したコンパイル済みバージョンに置き換えることです。これが機能すると仮定すると、よりポータブルにするためにインストルメント化できます。

注:JVMはObjectに追加のメソッドを持たせたくないことがわかりました(複数のメソッドを追加すると、奇妙なエラーが発生します)

于 2013-02-04T19:35:24.200 に答える
3

フィールドの取得と設定が難しい場合があります。

getfieldおよび命令のJVM仕様のputfield説明(私が正しく理解している場合)は、それらが配列で使用されないことを示しています。引用するにはgetfield

objectrefの型は配列型であってはなりません。

およびputfield

objectrefのクラスは配列であってはなりません。

ただし、「実行時に命令記述の制約(「必須」または「必須」)が満たされない場合、Java仮想マシンの動作は未定義であるため、正常に機能する可能性があります。

于 2013-02-04T19:31:41.810 に答える